Fuente/ Codesnippets | | | | | Un kleine Demo para Direkten einlesen de BMP-Archivos para Texturen con ASM-Befehlen/XPIA y el Befehl "GetDIBits" para OpenGL. El Farbe "schwarz" se durchsichtig suscrito. Um el Programa a benutzen, necesario todavía 2 Muster-BMP-Archivos erstellt voluntad. Durch el gute Ayuda en el Foro podría Yo el umsetzen. Durch el 2D vorraussetzungen con Opengl puede ser muy schön Sprites erzeugen y así trabajo. Mit el Tasten "Q,W,E,S" puede ser una bisschen speilen.
Diese Demo kann cada para se neu umsetzen y en propio Programas Teile su tomar. KompilierenMarcaSeparación $H Windows.ph
{$iq}
declare bild1$
declare x1!,y1!,dx!,dy!,winkel!
declare hWin&
If 0
AsmStart rgb_umwandlung
Parameters bildxy#,a
LOCAL r :BYTE
LOCAL g :BYTE
LOCAL b :BYTE
LOCAL w :DWORD
mov eax,para2
mov w,eax
mov ecx,0
mov ebx,para1
.while ecx<=w
mov al,[ebx+ecx]
mov b,al
mov al,[ebx+ecx+1]
mov g,al
mov al,[ebx+ecx+2]
mov r,al
and b,255
and g,255
and r,255
mov al,b
.if al>0
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
.endif
mov al,g
.if al>0
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
.endif
mov al,r
.if al>0
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
.endif
mov al,0
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
weiter:
add ecx,4
.endw
AsmEnd
EndIf
Window 20,20-600,450
Cls @RGB(220,220,220)
oGL("Init", %hWnd, 0,0, 0, 0)
oGL("PosMode", 1)
bild1$="muster.bmp"
var tex.auto%=erzeugetex(bild1$)
var tex.grund%=OGL("loadtexturebmp","muster1.bmp",3)
var ende%=1
WHILE ende%
sleep 1
if isKey(65)
ende% = 0
endif
if isKey(81)
winkel!=winkel!+0.4
endif
if isKey(69)
winkel!=winkel!-0.4
endif
if isKey(87)
y1!=Sin(winkel!/180.0*pi())*0.02
x1!=Cos(winkel!/180.0*pi())*0.02
dx!=dx!-x1!
dy!=dy!-y1!
endif
if isKey(83)
y1!=Sin(winkel!/180.0*pi())*0.02
x1!=Cos(winkel!/180.0*pi())*0.02
dx!=dx!+x1!
dy!=dy!+y1!
endif
drawglscene()
ENDWHILE
proc drawglscene
OGL("Clear")
OGL("glEnable",~GL_BLEND)
OGL("glBlendFunc",~GL_SRC_ALPHA, ~GL_ONE_MINUS_SRC_ALPHA)
OGL("move",0,0,-3)
OGL("texture",tex.grund%,10)
OGL("move",0,0,0)
OGL("quad",8,8)
OGL("origin",dx!,dy!,-3)
OGL("texture",tex.auto%,1)
OGL("rotate",0,0,winkel!+90)
OGL("quad",0.7,0.7)
OGL("show")
endproc
proc erzeugetex
parameters namebild$
declare width%,height%
declare Handle&,a&
declare bmi#,bildxy#
var texid%=0
mcls 0,0,0
startpaint -1
mloadbmp namebild$,0,0
endpaint
height%=%bmpx
width%=%bmpy
def &BI_RGB 0
def &DIB_RGB_COLORS 0
struct BITMAPINFOHEADER =
biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&,
biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
dim bmi#,BITMAPINFOHEADER
clear bmi#
with bmi#
.biSize& = sizeof(bmi#)
.biWidth& = width%
.biHeight& = height%
.biPlanes% = 1
.biBitCount% = 32
.biCompression& = &BI_RGB
.biSizeImage& = ((.biWidth& * .biBitCount% 8 - 1) | 3 + 1) * abs(.biHeight&)
endwith
Handle& = Create("hPic", -1, namebild$)
a&=bmi#.biSizeImage&
dim bildxy#,a&
~GetDIBits(%hdc,Handle&,0,bmi#.biHeight&,bildxy#,bmi#,0)
Call(xpia_getprocaddressm(xpia_hmodule&,"rgb_umwandlung"),bildxy#,a&)
OGL("glGenTextures",1,ADDR(texid%))
OGL("glBindTexture",~GL_TEXTURE_2D,texid%)
OGL("glEnable",~GL_ALPHA_TEST)
OGL("glAlphaFunc",~GL_GREATER, 0.1)
OGL("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
OGL("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR)
OGL("gluBuild2DMipmaps",~GL_TEXTURE_2D, ~GL_RGBA, height%, width%, ~GL_RGBA, ~GL_UNSIGNED_BYTE, bildxy#)
dispose bmi#
disponer bildxy#
RETORNO texid%
ENDPROC
|
| | | | |
| | Jörg Sellmeyer | En me se el erste Bild en 90° gegen el Uhrzeigersinn gedreht. Wenns Absicht es, kann Yo el zumindest en el Code no encontrar. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 19.08.2008 ▲ |
| |
| | | Weil él el Achsen (no) vertauscht. |
| | | | |
| | | Das war en mi Vorhaben absicht , porque lo el Grafikform erforderte.
OGL("rotate",0,0,winkel!+90) poner : OGL("rotate",0,0,winkel! )
¿Puede auch todavía el SINUS y COSINUS verändern después de belieben.
mfg |
| | | | |
| | Jörg Sellmeyer | | | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 19.08.2008 ▲ |
| |
| | | Der ASM-Code es una bisschen gekürzt con : "jmp wandle". Und así puede ser se entonces al Code todavía austoben con mejor Routinen.
Wenn uno el DLL nimmt, puede ser auch dieses reinsetzen :
DEF rgb_umwandlung(2) ! "muster.dll","rgb_umwandlung" y así aufrufen: rgb_umwandlung(bildxy#,a&) KompilierenMarcaSeparación
If 0
AsmStart rgb_umwandlung
Parameters bildxy#,a
LOCAL r :BYTE
LOCAL g :BYTE
LOCAL b :BYTE
LOCAL w :DWORD
mov eax,para2
mov w,eax
mov ecx,0
mov ebx,para1
.while ecx<=w
mov al,[ebx+ecx]
mov b,al
mov al,[ebx+ecx+1]
mov g,al
mov al,[ebx+ecx+2]
mov r,al
and b,255
and g,255
and r,255
mov al,b
.if al>0
jmp wandle
.endif
mov al,g
.if al>0
jmp wandle
.endif
mov al,r
.if al>0
jmp wandle
.endif
mov al,0
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
jmp weiter
wandle:
mov al,255
mov [ebx+ecx+3],al
mov al,b
mov [ebx+ecx+2],al
mov al,r
mov [ebx+ecx],al
weiter:
add ecx,4
.endw
AsmEnd
ss=s4 href='./../../function-references/XProfan/endif/'>EndIf
|
| | | | |
|
Zum QuelltextThemeninformationenDieses Thema ha 3 subscriber: |