Source/ Codesnippets | | | | | une kleine Demo zum Direkten einlesen de BMP-Fichiers pour Texturen avec ASM-Befehlen/XPIA et dem Befehl "GetDIBits" pour OpenGL. qui la couleur "schwarz" wird durchsichtig gezeichnet. Um cela Programme trop benutzen, doit encore 2 Muster-BMP-Fichiers erstellt volonté. par qui gute Aider im Forum konnte je cela umsetzen. par qui 2D vorraussetzungen avec Opengl peux on très joli Sprites erzeugen et avec cela travailler. avec den Tasten "Q,W,E,S" peux on un bisschen speilen.
cet Demo peux chacun pour sich récente umsetzen et dans eigene Programme Teile en prendre. KompilierenMarqueSéparation $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#
dispose bildxy#
RETOUR texid%
endproc
|
| | | | |
| | Jörg Sellmeyer | chez mir wird cela erste Bild um 90° vers den Uhrzeigersinn gedreht. Wenns intention ist, peux je cela zumindest dans dem Code pas trouver. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 19.08.2008 ▲ |
| |
| | | Weil il qui Achsen (pas) vertauscht. |
| | | | |
| | | cela était dans mon projet intention , weil es qui Grafikform erforderte.
OGL("rotate",0,0,winkel!+90) mets : OGL("rotate",0,0,winkel! )
peux aussi encore qui SINUS et COSINUS verändern pour belieben.
mfg |
| | | | |
| | Jörg Sellmeyer | Ok, cela J'ai eu pas gesehen. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 19.08.2008 ▲ |
| |
| | | qui ASM-Code est un bisschen gekürzt avec : "jmp wandle". et so peux on sich ensuite am Code encore austoben avec besseren Routinen.
si on qui DLL nimmt, peux on aussi cet reinsetzen :
DEF rgb_umwandlung(2) ! "muster.dll","rgb_umwandlung" et so appel: rgb_umwandlung(bildxy#,a&) KompilierenMarqueSéparation
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 QuelltextOptions du sujet | 7.068 Views |
Themeninformationencet Thema hat 3 participant: |