Wünsche und Anregungen | | | |  | Ich benenne hier einfach mal Funktionswünsche welche helfen können das XProfan-Spieleprogrammierer mehr Performance innerhalb der Programme erreichen können. (Performance ist bei Spielen ja oft wichtiger als z.B. bei einer kleineren Datenbankanwendung.)
Würde mich freuen wenn auch andere hier die eine oder andere Idee für Roland hinterlassen würden.
• Rechteckintersektionskontrolle (ggf. mit Überlappungsfaktor als Float) • Distance zweier Punkte (2D & 3D) ( [...] ) KompilierenMarkierenSeparieren • Bound (normalisieren?) bound(x,-30,30) KompilierenMarkierenSeparieren Das mag zwar alles kleinlich wirken, aber es macht schon einen erheblichen Geschwindigkeitsunterschied aus wenn man auf solche native Helfer zurückgreifen könnte, und besonders bei Spielen zählt jedes µ. |
| | | | |
| |  | Nächster Part - unterthema OpenGL.
Folgende Funktionen - wenn nativ Umgesetzt - könnten dem XProfan-OGL-Spieleentwickler deutlich mehr freude beim Programmieren verschaffen! KompilierenMarkierenSeparieren
ogl.rectangle(float x,y,xx,yy,bool filled){
if filled {
/*
xx:=xx-x
yy:=yy-y+1
x:=x+xx/2+1
y:=y+yy/2
ogl(move,x,y-1,)
ogl(quad,xx+1,0-yy)
ogl(move,-x,-y+1,0)
*/
ogl(glBegin,GL_QUADS)
oGL(glTexCoord2f,0.0,1.0)
ogl(glVertex3f,x,y,)
oGL(glTexCoord2f,1.0,1.0)
ogl(glVertex3f,xx,y,)
oGL(glTexCoord2f,1.0,0.0)
ogl(glVertex3f,xx,yy,)
oGL(glTexCoord2f,0.0,0.0)
ogl(glVertex3f,x,yy,)
ogl(glEnd)
} else {
ogl(glBegin,GL_LINE_LOOP)
ogl(glVertex3f,x,y,)
ogl(glVertex3f,xx,y,)
ogl(glVertex3f,xx,yy,)
ogl(glVertex3f,x,yy,)
ogl(glEnd)
}
}
Und diese: KompilierenMarkierenSeparieren
ogl.line(float x,y,xx,yy){
ogl(glBegin,GL_LINES)
ogl(glVertex3f,x,y,)
ogl(glVertex3f,xx,yy,)
ogl(glEnd)
}
ogl.ngon(float x,y,xx,yy,long cnt,float rot,bool filled){
ogl(glBegin,if(filled,GL_POLYGON,GL_LINE_LOOP))
float f:=rot*pi180,ffac:=(my2PI/cnt)
whileloop cnt {
ogl(glVertex3f,x+cos(f)*xx,y+sin(f)*yy,)
f:=f+ffac
}
ogl(glEnd)
}
ogl.2drotate(float x,y,r1,r2,r3){
case pcount<5:r3:=0
case pcount<4:r2:=0
if pcount==1 {
r1:=x
x:=ogl.maxx/2
y:=ogl.maxy/2
}
ogl(move,x,y,)
ogl(rotate,r3,r2,r1)
ogl(move,-x,-y,)
}
ogl.2dscale(float x,y,f){
if pcount==1 {
f:=x
x:=ogl.maxx/2
y:=ogl.maxy/2
}
ogl(move,x,y,)
ogl(scale,f)
ogl(move,-x,-y,)
}
ogl.2dmove(float x,y){
ogl(move,x,y,)
}
und darauf aufbauend diese: KompilierenMarkierenSeparieren
ogl.drawpic(long tex,long x,y,xx,yy,float a){
case pcount>5 : ogl(color,1,1,1,a)
ogl(texture,tex,1)
ogl.rectangle(x,y,x+xx,y+yy,true)
}
ogl.color(long col,a){ogl(color,getrvalue(col)/255,getgvalue(col)/255,getbvalue(col)/255,a/255)}
Und auch wenn unübersichtlich erscheint - desto wichtiger diese: (benötigte Texturdatei im Anhang) KompilierenMarkierenSeparieren
ogl.drawSysText(float x,y,string txt,float sz,szY,hopX,szX,xtraProcAddr){
case pcount<8 : xtraProcAddr:=0
case pcount<7 : szX:=1
case pcount<6 : hopX:=1
case pcount<5 : szY:=1
case pcount<4 : sz:=1
hopX:=hopX*sz
szX:=szX*sz
float xx:=x+32*szX
float yy:=y+32*sz*szY
float tx,ty,txx,tyy
long column,row,o,c:=len(txt)
ogl.push
ogl(texture,ogl.texSysfnt,1)
hopX:=16*hopX
case xtraProcAddr:call(xtraProcAddr,c,0,(x-xx)*1000000,(y-yy)*1000000,hopX*1000000)
whileloop c {
o:=ord(mid$(txt,loop,1))
column:=o16
row:=o-column*16
tx:=0.0625*column-0.005
ty:=0.0625*(16-row-1)-0.005
txx:=tx+0.0625
tyy:=ty+0.0625
case xtraProcAddr:call(xtraProcAddr,c,loop,(x-xx)*1000000,(y-yy)*1000000,hopX*1000000)
oGL(glBegin,GL_QUADS)
oGL(glTexCoord2f,tx,tyy)
oGL(glVertex3f,x,y,)
oGL(glTexCoord2f,txx,tyy)
oGL(glVertex3f,xx,y,)
oGL(glTexCoord2f,txx,ty)
oGL(glVertex3f,xx,yy,)
oGL(glTexCoord2f,tx,ty)
oGL(glVertex3f,x,yy,)
ogl(glEnd)
casenot xtraProcAddr:ogl(move,hopX,,)
}
ogl.pop
return hopX
}
von dieser ganz zu schweigen: KompilierenMarkierenSeparieren
ogl.LoadTEX(string fileName,float greater,long modi,bool smooth){
case pcount<2 : greater:=NUL
case pcount<3 : modi:=NUL
case pcount<4 : smooth:=true
case greater==NUL : greater:=0.001
case modi==NUL : modi:=GL_MODULATE
casenot fileexists(fileName) : return false
if lower$(getfileext(fileName))==tex {
long fSiz:=filesize(fileName)
case (fSiz<4) : return false
mem mem:=fSiz
long bytesRead:=blockread(fileName,mem,,fSiz)
casenot (bytesRead==fSiz) : return false
long iWidth=sqrt(fSiz4)
long txID=0
ogl(glGenTextures,1,addr(txID))
ogl(glBindTexture,GL_TEXTURE_2D,txID);
ogl(glEnable,GL_ALPHA_TEST)
ogl(glAlphaFunc,GL_GREATER, greater)
ogl(glTexEnvi,GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modi)
ogl(glTexParameteri,GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR)
ogl(glTexParameteri,GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,if(smooth,GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR))
ogl(glMatrixMode,GL_PROJECTION)
ogl(gluBuild2DMipmaps,GL_TEXTURE_2D, GL_RGBA, iWidth, iWidth, GL_RGBA, GL_UNSIGNED_BYTE, mem)
dispose mem
} else {
long lxx:=greater
case ogl.percMode : lxx:=lxx*ogl.maxx/100
case pcount==2 : modi:=3
if lxx>1024 {lxx:=1024} else if lxx>512 {lxx:=1024} else if lxx>256 {lxx:=512} else if lxx>128 {lxx:=256} else if lxx>64 {lxx:=128} else if lxx>32 {lxx:=64} else {lxx:=32}
casenot mid$(fileName,2,1)==: : fileName:=getdir$(@)+/+filename
long h:=create(hSizedPic,-1,fileName,lxx,lxx,)
long txID:=ogl(gettexturebmp,h,modi)
deleteobject h
}
ogl.clear()//wichtig
return txID
}
Und was einfaches: KompilierenMarkierenSeparieren Und was wichtiges!: KompilierenMarkierenSeparieren
ogl.vsync(bool vsync){
casenot ogl.hasExtension(WGL_EXT_swap_control) : return -1
long wglSwapIntervalEXT:=wglGetProcAddress(wglSwapIntervalEXT)
long wglGetSwapIntervalEXT:=wglGetProcAddress(wglGetSwapIntervalEXT)
if wglGetSwapIntervalEXT {
bool isVSync:=call(wglGetSwapIntervalEXT)
case pcount <1 : return isVSync
}
call(wglSwapIntervalEXT,vsync)
return ogl.vsync()
}
ogl.hasExtension(string eName){return if(instr(eName,ogl.extensions),true,)}
ogl.ortho(long x,y,xx,yy,z,zz){
glLoadIdentity()
glViewport(0,0,width(hwnd),height(hwnd))
mem mem=48
float mem#,0 =x,xx,y,yy,z,zz
ogl(glOrtho,long(mem#,0 ),long(mem#,4 ),long(mem#,8 ),long(mem#,12),long(mem#,16),long(mem#,20),long(mem#,24),long(mem#,28),long(mem#,32),long(mem#,36),long(mem#,40),long(mem#,44))
dispose mem
}
ogl.extensions:=string$(glGetString(GL_EXTENSIONS),0)//sollte vlt. xprofanSysVariableString sein
|
 | | | | |
| |  | Unterthema Vektorkollisionen/Winkelfunktionen:
Ok ich warte besser erst einmal bis Roland die Gespräche zu o.g. Themen aufgenommen hat.  |
| | | | |
| |  Frank Abbing | Ich erdreiste mich auch mal... 
Ogl: Schatten Nr.1 KompilierenMarkierenSeparieren {$iq}
declare time&, frames%
declare ende%,x!
declare g_fSpinX_L!,g_fSpinY_L!
g_fSpinX_L! = 0.0
g_fSpinY_L! = -10.0
declare g_fSpinX_R!,g_fSpinY_R!
g_fSpinX_R! = 0.0
g_fSpinY_R! = 0.0
declare g_floorQuad#
dim g_floorQuad#,96
long g_floorQuad#, 0 = single(0.0), single(1.0), single(0.0), single(-5.0), single(0.0), single(-5.0)
long g_floorQuad#,24 = single(0.0), single(1.0), single(0.0), single(-5.0), single(0.0), single(5.0)
long g_floorQuad#,48 = single(0.0), single(1.0), single(0.0), single(5.0), single(0.0), single(5.0)
long g_floorQuad#,72 = single(0.0), single(1.0), single(0.0), single(5.0), single(0.0), single(-5.0)
declare g_shadowMatrix![16],g_lightPosition![4]
g_lightPosition![0] = 2.0
g_lightPosition![1] = 6.0
g_lightPosition![2] = 0.0
g_lightPosition![3] = 1.0
declare g_lightPosition#
dim g_lightPosition#,16
declare shadowPlane![4],v0![3],v1![3],v2![3]
declare g_shadowMatrix#
dim g_shadowMatrix#,128
proc init
oGL(Init, %hWnd, 0.35, 0.53, 0.7, 1)
oGL(PosMode, 1)
endproc
proc buildShadowMatrix
Calculate the dot-product between the plane and the lights position
declare dotp!
dotp! = shadowPlane![0] * g_lightPosition![0] + shadowPlane![1] * g_lightPosition![1] + shadowPlane![1] * g_lightPosition![2] + shadowPlane![3] * g_lightPosition![3]
First column
g_shadowMatrix![0] = dotp! - g_lightPosition![0] * shadowPlane![0]
g_shadowMatrix![4] = 0.0 - g_lightPosition![0] * shadowPlane![1]
g_shadowMatrix![8] = 0.0 - g_lightPosition![0] * shadowPlane![2]
g_shadowMatrix![12] = 0.0 - g_lightPosition![0] * shadowPlane![3]
Second column
g_shadowMatrix![1] = 0.0 - g_lightPosition![1] * shadowPlane![0]
g_shadowMatrix![5] = dotp! - g_lightPosition![1] * shadowPlane![1]
g_shadowMatrix![9] = 0.0 - g_lightPosition![1] * shadowPlane![2]
g_shadowMatrix![13] = 0.0 - g_lightPosition![1] * shadowPlane![3]
Third column
g_shadowMatrix![2] = 0.0 - g_lightPosition![2] * shadowPlane![0]
g_shadowMatrix![6] = 0.0 - g_lightPosition![2] * shadowPlane![1]
g_shadowMatrix![10] = dotp! - g_lightPosition![2] * shadowPlane![2]
g_shadowMatrix![14] = 0.0 - g_lightPosition![2] * shadowPlane![3]
Fourth column
g_shadowMatrix![3] = 0.0 - g_lightPosition![3] * shadowPlane![0]
g_shadowMatrix![7] = 0.0 - g_lightPosition![3] * shadowPlane![1]
g_shadowMatrix![11] = 0.0 - g_lightPosition![3] * shadowPlane![2]
g_shadowMatrix![15] = dotp! - g_lightPosition![3] * shadowPlane![3]
Alles jetzt in die Bereichsvariable schreiben
(sollte man natürlich direkt machen, aber so ist es erstmal übersichtlicher...)
float g_shadowMatrix#, 0 = g_shadowMatrix![0],g_shadowMatrix![1],g_shadowMatrix![2],g_shadowMatrix![3]
float g_shadowMatrix#,32 = g_shadowMatrix![4],g_shadowMatrix![5],g_shadowMatrix![6],g_shadowMatrix![7]
float g_shadowMatrix#,64 = g_shadowMatrix![8],g_shadowMatrix![9],g_shadowMatrix![10],g_shadowMatrix![11]
float g_shadowMatrix#,96 = g_shadowMatrix![12],g_shadowMatrix![13],g_shadowMatrix![14],g_shadowMatrix![15]
endproc
proc findPlane
declare vec0![3], vec1![3]
Need 2 vectors to find cross product
vec0![0] = v1![0] - v0![0]
vec0![1] = v1![1] - v0![1]
vec0![2] = v1![2] - v0![2]
vec1![0] = v2![0] - v0![0]
vec1![1] = v2![1] - v0![1]
vec1![2] = v2![2] - v0![2]
Find cross product to get A, B, and C of plane equation
shadowPlane![0] = vec0![1] * vec1![2] - vec0![2] * vec1![1]
shadowPlane![1] = -(vec0![0] * vec1![2] - vec0![2] * vec1![0])
shadowPlane![2] = vec0![0] * vec1![1] - vec0![1] * vec1![0]
shadowPlane![3] = -(shadowPlane![0] * v0![0] + shadowPlane![1] * v0![1] + shadowPlane![2] * v0![2])
endproc
proc renderObject
oGL(Push)
oGL(glTranslatef, 0.0, 2.5, 0.0)
oGL(glRotatef, -g_fSpinY_R!, 1.0, 0.0, 0.0)
oGL(glRotatef, -g_fSpinX_R!, 0.0, 1.0, 0.0)
oGL(Rotate, 90, 0, 0)
oGL(Cuboid, 2, 2, 2)
oGL(Move, 0, -2, 2)
oGL(Sphere, 1.2, 16, 16)
oGL(Pop)
endproc
proc render
To define a plane that matches the floor, we need to 3 vertices from it
v0![0] = double(long(g_floorQuad#,12))
v0![1] = double(long(g_floorQuad#,16))
v0![2] = double(long(g_floorQuad#,20))
v1![0] = double(long(g_floorQuad#,36))
v1![1] = double(long(g_floorQuad#,40))
v1![2] = double(long(g_floorQuad#,44))
v2![0] = double(long(g_floorQuad#,60))
v2![1] = double(long(g_floorQuad#,64))
v2![2] = double(long(g_floorQuad#,68))
findPlane
Build a shadow matrix using the lights current position and the plane
buildShadowMatrix
oGL(Clear)
oGL(glClear, ~GL_COLOR_BUFFER_BIT | ~GL_DEPTH_BUFFER_BIT)
Place the view
oGL(glMatrixMode, ~GL_MODELVIEW)
oGL(glLoadIdentity)
oGL(glTranslatef, 0.0, -2.0, -15.0)
oGL(glRotatef, -g_fSpinY_L!, 1.0, 0.0, 0.0)
oGL(glRotatef, -g_fSpinX_L!, 0.0, 1.0, 0.0)
Create a shadow by rendering the teapot using the shadow matrix.
oGL(glDisable, ~GL_DEPTH_TEST)
oGL(glDisable, ~GL_LIGHTING)
oGL(glColor3f, 0.2, 0.4, 0.6) Shadows color
oGL(Push)
oGL(glMultMatrixd, g_shadowMatrix#)
renderObject
oGL(Pop)
oGL(glEnable, ~GL_DEPTH_TEST)
oGL(glEnable, ~GL_LIGHTING)
Render the lights position as a sphere...
oGL(glDisable, ~GL_LIGHTING)
oGL(Push)
long g_lightPosition#,0 = single(g_lightPosition![0]),single(g_lightPosition![1]),single(g_lightPosition![2]),single(g_lightPosition![3])
oGL(glLightfv, ~GL_LIGHT0, ~GL_POSITION, g_lightPosition#)
Place a sphere to represent the light
oGL(glTranslatef, g_lightPosition![0], g_lightPosition![1], g_lightPosition![2])
oGL(glColor3f, 1.0, 1.0, 0.5)
oGL(Sphere,0.1, 8, 8)
oGL(Pop)
oGL(glEnable, ~GL_LIGHTING)
oGL(glColor3f, 1.0, 0.3, 0.0) Objektss color
Render normal teapot
renderObject
oGL(Show)
endproc
-----------------------------------------------------------------------------------
Cls
init
time& = &GetTickCount
frames% = 0
ende% = 0
SetTimer 10
whilenot ende%
WaitInput
if IsKey(27)
ende% = 1
elseif IsKey(38)
g_lightPosition![3] = g_lightPosition![3] + 0.1
elseif IsKey(40)
g_lightPosition![3] = g_lightPosition![3] - 0.1
elseif IsKey(37)
g_lightPosition![2] = g_lightPosition![2] - 0.1
elseif IsKey(39)
g_lightPosition![2] = g_lightPosition![2] + 0.1
endif
render
SetText %hWnd, str$(g_lightPosition![2]) + , +str$(g_lightPosition![3])
wend
KillTimer
dispose g_floorQuad#
dispose g_shadowMatrix#
dispose g_lightPosition#
End
|
| | | | |
| |  Frank Abbing | Ogl: Schatten Nr.2 KompilierenMarkierenSeparieren {$iq}
declare time&, frames%
declare ende%,x!,xx!,yy!,zz!
declare g_fSpinX_L!,g_fSpinY_L!
g_fSpinX_L! = 0.0
g_fSpinY_L! = -10.0
declare g_fSpinX_R!,g_fSpinY_R!
g_fSpinX_R! = 0.0
g_fSpinY_R! = 0.0
declare g_floorQuad#
dim g_floorQuad#,96
long g_floorQuad#, 0 = single(0.0), single(1.0), single(0.0), single(-5.0), single(0.0), single(-5.0)
long g_floorQuad#,24 = single(0.0), single(1.0), single(0.0), single(-5.0), single(0.0), single(5.0)
long g_floorQuad#,48 = single(0.0), single(1.0), single(0.0), single(5.0), single(0.0), single(5.0)
long g_floorQuad#,72 = single(0.0), single(1.0), single(0.0), single(5.0), single(0.0), single(-5.0)
declare g_shadowMatrix![16],g_lightPosition![4]
g_lightPosition![0] = 2.0
g_lightPosition![1] = 20.0
g_lightPosition![2] = 0.0
g_lightPosition![3] = 1.0
declare g_lightPosition#
dim g_lightPosition#,16
declare shadowPlane![4],v0![3],v1![3],v2![3]
declare g_shadowMatrix#
dim g_shadowMatrix#,128
proc init
oGL(Init, %hWnd, 0.35, 0.53, 0.7, 1)
oGL(PosMode, 1)
endproc
proc buildShadowMatrix
Calculate the dot-product between the plane and the lights position
declare dotp!
dotp! = shadowPlane![0] * g_lightPosition![0] + shadowPlane![1] * g_lightPosition![1] + shadowPlane![1] * g_lightPosition![2] + shadowPlane![3] * g_lightPosition![3]
First column
g_shadowMatrix![0] = dotp! - g_lightPosition![0] * shadowPlane![0]
g_shadowMatrix![4] = 0.0 - g_lightPosition![0] * shadowPlane![1]
g_shadowMatrix![8] = 0.0 - g_lightPosition![0] * shadowPlane![2]
g_shadowMatrix![12] = 0.0 - g_lightPosition![0] * shadowPlane![3]
Second column
g_shadowMatrix![1] = 0.0 - g_lightPosition![1] * shadowPlane![0]
g_shadowMatrix![5] = dotp! - g_lightPosition![1] * shadowPlane![1]
g_shadowMatrix![9] = 0.0 - g_lightPosition![1] * shadowPlane![2]
g_shadowMatrix![13] = 0.0 - g_lightPosition![1] * shadowPlane![3]
Third column
g_shadowMatrix![2] = 0.0 - g_lightPosition![2] * shadowPlane![0]
g_shadowMatrix![6] = 0.0 - g_lightPosition![2] * shadowPlane![1]
g_shadowMatrix![10] = dotp! - g_lightPosition![2] * shadowPlane![2]
g_shadowMatrix![14] = 0.0 - g_lightPosition![2] * shadowPlane![3]
Fourth column
g_shadowMatrix![3] = 0.0 - g_lightPosition![3] * shadowPlane![0]
g_shadowMatrix![7] = 0.0 - g_lightPosition![3] * shadowPlane![1]
g_shadowMatrix![11] = 0.0 - g_lightPosition![3] * shadowPlane![2]
g_shadowMatrix![15] = dotp! - g_lightPosition![3] * shadowPlane![3]
Alles jetzt in die Bereichsvariable schreiben
(sollte man natürlich direkt machen, aber so ist es erstmal übersichtlicher...)
float g_shadowMatrix#, 0 = g_shadowMatrix![0],g_shadowMatrix![1],g_shadowMatrix![2],g_shadowMatrix![3]
float g_shadowMatrix#,32 = g_shadowMatrix![4],g_shadowMatrix![5],g_shadowMatrix![6],g_shadowMatrix![7]
float g_shadowMatrix#,64 = g_shadowMatrix![8],g_shadowMatrix![9],g_shadowMatrix![10],g_shadowMatrix![11]
float g_shadowMatrix#,96 = g_shadowMatrix![12],g_shadowMatrix![13],g_shadowMatrix![14],g_shadowMatrix![15]
endproc
proc findPlane
declare vec0![3], vec1![3]
Need 2 vectors to find cross product
vec0![0] = v1![0] - v0![0]
vec0![1] = v1![1] - v0![1]
vec0![2] = v1![2] - v0![2]
vec1![0] = v2![0] - v0![0]
vec1![1] = v2![1] - v0![1]
vec1![2] = v2![2] - v0![2]
Find cross product to get A, B, and C of plane equation
shadowPlane![0] = vec0![1] * vec1![2] - vec0![2] * vec1![1]
shadowPlane![1] = -(vec0![0] * vec1![2] - vec0![2] * vec1![0])
shadowPlane![2] = vec0![0] * vec1![1] - vec0![1] * vec1![0]
shadowPlane![3] = -(shadowPlane![0] * v0![0] + shadowPlane![1] * v0![1] + shadowPlane![2] * v0![2])
endproc
proc renderObject
oGL(Push)
oGL(glTranslatef, 0.0, 2.0, 0.0)
oGL(glRotatef, -g_fSpinY_R!, 1.0, 0.0, 0.0)
oGL(glRotatef, -g_fSpinX_R!, 0.0, 1.0, 0.0)
oGL(Rotate, xx!, yy!, zz!)
oGL(Cuboid, 4, 2, 8)
oGL(Pop)
endproc
proc render
To define a plane that matches the floor, we need to 3 vertices from it
v0![0] = double(long(g_floorQuad#,12))
v0![1] = double(long(g_floorQuad#,16))
v0![2] = double(long(g_floorQuad#,20))
v1![0] = double(long(g_floorQuad#,36))
v1![1] = double(long(g_floorQuad#,40))
v1![2] = double(long(g_floorQuad#,44))
v2![0] = double(long(g_floorQuad#,60))
v2![1] = double(long(g_floorQuad#,64))
v2![2] = double(long(g_floorQuad#,68))
findPlane
Build a shadow matrix using the lights current position and the plane
buildShadowMatrix
oGL(Clear)
oGL(glClear, ~GL_COLOR_BUFFER_BIT | ~GL_DEPTH_BUFFER_BIT)
Place the view
oGL(glMatrixMode, ~GL_MODELVIEW)
oGL(glLoadIdentity)
oGL(glTranslatef, 0.0, -2.0, -15.0)
oGL(glRotatef, -g_fSpinY_L!, 1.0, 0.0, 0.0)
oGL(glRotatef, -g_fSpinX_L!, 0.0, 1.0, 0.0)
Create a shadow by rendering the teapot using the shadow matrix.
oGL(glDisable, ~GL_DEPTH_TEST)
oGL(glDisable, ~GL_LIGHTING)
oGL(glColor3f, 0.2, 0.4, 0.6) Shadows color
oGL(Push)
oGL(glMultMatrixd, g_shadowMatrix#)
renderObject
oGL(Pop)
oGL(glEnable, ~GL_DEPTH_TEST)
oGL(glEnable, ~GL_LIGHTING)
Render the lights position as a sphere...
oGL(glDisable, ~GL_LIGHTING)
oGL(Push)
long g_lightPosition#,0 = single(g_lightPosition![0]),single(g_lightPosition![1]),single(g_lightPosition![2]),single(g_lightPosition![3])
oGL(glLightfv, ~GL_LIGHT0, ~GL_POSITION, g_lightPosition#)
Place a sphere to represent the light
oGL(glTranslatef, g_lightPosition![0], g_lightPosition![1], g_lightPosition![2])
oGL(glColor3f, 1.0, 1.0, 0.5)
oGL(Sphere,0.1, 8, 8)
oGL(Pop)
oGL(glEnable, ~GL_LIGHTING)
oGL(glColor3f, 1.0, 0.3, 0.0) Objektss color
Render normal teapot
renderObject
oGL(Show)
endproc
-----------------------------------------------------------------------------------
Cls
init
time& = &GetTickCount
frames% = 0
ende% = 0
SetTimer 10
whilenot ende%
WaitInput
if IsKey(27)
ende% = 1
elseif IsKey(38)
xx!=xx!+.5
elseif IsKey(40)
xx!=xx!-.5
elseif IsKey(37)
yy!=yy!+.5
elseif IsKey(39)
yy!=yy!-.5
elseif IsKey($41)
zz!=zz!+.5
elseif IsKey($59)
zz!=zz!-.5
endif
render
inc frames%
if &GetTickCount - time& >= 1000
SetText %hWnd, str$(frames%) + Frames/sek
time& = &GetTickCount
frames% = 0
endif
wend
KillTimer
dispose g_floorQuad#
dispose g_shadowMatrix#
dispose g_lightPosition#
End
|
| | | | |
| |  Frank Abbing | Ogl: Anti-Aliasing KompilierenMarkierenSeparieren {$cleq}
$H Windows.ph
$H ARB_const.ph
declare arbMultisampleSupported%
declare arbMultisampleFormat%
WGLisExtensionSupported: This Is A Form Of The Extension For WGL
proc WGLisExtensionSupported
parameters ext$
declare len%,pProc&,pSupported&
len% = Len(ext$)
pProc& = oGL(wglGetProcAddress, wglGetExtensionsStringARB)
case pProc& : pSupported& = Call(pProc&, oGL(wglGetCurrentDC))
casenot pSupported& : pSupported& = oGL(glGetString, ~GL_EXTENSIONS)
casenot pSupported& : return 0
declare supported$
let supported$ = string$(pSupported&, 0)
declare temp#
dim temp#, Len(supported$) + 1
string temp#, 0 = supported$
declare pos&
pos& = MemPos(temp#,0,ext$)
while pos& <> -1
if (pos& = 0) or (Byte(temp#, pos& - 1) = 32)
if (Byte(temp#, pos& + len%) = 32) or (Byte(temp#, pos& + len%) = 0)
dispose temp#
return 1
endif
endif
pos& = MemPos(temp#, pos&, ext$)
endwhile
dispose temp#
return 0
endproc
InitMultisample: Used To Query The Multisample Frequencies
proc InitMultisample(HINSTANCE hInstance,HWND hWnd,PIXELFORMATDESCRIPTOR pfd)
parameters hInst&,hWnd&,pfd#
ifnot WGLisExtensionSupported(WGL_ARB_multisample)
arbMultisampleSupported% = 0
return 0
endif
declare pProc&
pProc& = oGL(wglGetProcAddress,wglChoosePixelFormatARB)
ifnot pProc&
arbMultisampleSupported% = 0
return 0
endif
declare hDC&
hDC& = ~GetDC(hWnd&)
declare pixelFormat%,valid%,numFormats%
declare fAttributes#
dim fAttributes#, 8
clear fAttributes# = {0,0};
declare iAttributes#
dim iAttributes#, 88
Long iAttributes#, 0 = ~WGL_DRAW_TO_WINDOW_ARB,~GL_TRUE,
~WGL_SUPPORT_OPENGL_ARB,~GL_TRUE,
~WGL_ACCELERATION_ARB,~WGL_FULL_ACCELERATION_ARB,
~WGL_COLOR_BITS_ARB,24,
~WGL_ALPHA_BITS_ARB,8,
~WGL_DEPTH_BITS_ARB,16,
~WGL_STENCIL_BITS_ARB,0,
~WGL_DOUBLE_BUFFER_ARB,~GL_TRUE,
~WGL_SAMPLE_BUFFERS_ARB,~GL_TRUE,
~WGL_SAMPLES_ARB,8, Test For 8 Samples
0,0
valid% = Call(pProc&, hDC&, iAttributes#, fAttributes#, 1, Addr(pixelFormat%), Addr(numFormats%))
if valid% and (numFormats% >= 1)
arbMultisampleSupported% = 1
arbMultisampleFormat% = pixelFormat%
dispose fAttributes#
dispose iAttributes#
return arbMultisampleSupported%
endif
Our Pixel Format With 4 Samples Failed, Test For 4 Samples
Long iAttributes#, 19 * 4 = 4
valid% = Call(pProc&, hDC&, iAttributes#, fAttributes#, 1, Addr(pixelFormat%), Addr(numFormats%))
if valid% and (numFormats% >= 1)
arbMultisampleSupported% = 1
arbMultisampleFormat% = pixelFormat%
dispose fAttributes#
dispose iAttributes#
return arbMultisampleSupported%
endif
Our Pixel Format With 4 Samples Failed, Test For 2 Samples
Long iAttributes#, 19 * 4 = 2
valid% = Call(pProc&, hDC&, iAttributes#, fAttributes#, 1, Addr(pixelFormat%), Addr(numFormats%))
if valid% and (numFormats% >= 1)
arbMultisampleSupported% = 1
arbMultisampleFormat% = pixelFormat%
endif
dispose fAttributes#
dispose iAttributes#
return arbMultisampleSupported%
endproc
proc DrawGLScene
oGL(Clear)
oGL(Origin, -1.5, 0, -6)
oGL(Color, .5, .5, .8, .5)
oGL(Rotate, 0, rtri!, y!)
oGL(Pyramid, 2, 4, 2)
oGL(Origin, 1.5, 0, -6)
oGL(Color, .8, .2, .3, 1)
oGL(Rotate, rquad!, y!/1.2, 0)
oGL(Cuboid, 2, 2, 2)
oGL(Show)
rtri! = rtri! + .5
rquad! = rquad! - .3
y!=y!+.1
endproc
Zum Testen:
Cls
declare wnd&
let wnd& = Create(Window,%hwnd,Test,100,100,400,400)
oGL(Init,wnd&,1,1,1,1)
InitMultisample(%hInstance,wnd&,0)
DestroyWindow(wnd&)
If arbMultisampleFormat%
oGL(Init,%hwnd,0,0,0,1,arbMultisampleFormat%)
Else
oGL(Init,%hwnd,0,0,0,1)
EndIf
declare time&, frames%
declare rtri!,rquad!,y!
declare ende%, lm%
Ogl(PosMode, 1)
time& = &GetTickCount
frames% = 0
Ende% = 0
setTimer 20 max 50 Frames /sek.
WhileNot ende%
WaitInput
if isKey(27)
ende% = 1
endif
DrawGLScene()
inc frames%
if &GetTickCount - time& >= 1000 1 Sekunde ist rum
setText %hWnd, str$(frames%) + Frames/sek
time& = &GetTickCount
frames% = 0
endif
EndWhile
killTimer
end
|
 | | | | |
| |  RGH | iF
Unterthema Vektorkollisionen/Winkelfunktionen: Ok ich warte besser erst einmal bis Roland die Gespräche zu o.g. Themen aufgenommen hat. 
Hm, wenn die Quelltexte in sauber strukturiertem XProfan wären, könnte ich sie ja mal ausprobieren, um zu sehen, was die Funktionen machen sollen ... ;)
Klingt aber nicht unitinteressant ...
Gruß Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 05.11.2007 ▲ |
| |
| |  | | | | | |
| |  RGH | Hallo,
das Thema oGL in Version 11 kommt noch.
Zum Rest:
Bound() und RecIntersect() ist ja in der aktuellen Subscriptionsversion enthalten: KompilierenMarkierenSeparierenbetween(X!, vonX!, bisX!)
between(X!, vonX!, bisX!, Y!, vonY!, bisY!)
between(X!, vonX!, bisX!, Y!, vonY!, bisY!, Z!, vonZ!, bisZ!)
Intersec(typ$, object1#, object2#)
range(X!, vonX!, bisX!) = iFs bound()
Dist() ist eine interessante Idee, aber (noch) nicht realisiert: KompilierenMarkierenSeparierendist(X1!, Y1!, X2!, Y2!) sqrt((X2! -X1!)^2 + (Y2! - Y1!)^2)
dist(X1!, Y1!, Z1!, X2!, Y2!, Z2!) sqrt((X2! -X1!)^2 + (Y2! - Y1!)^2 + (Z2! - Z1!)^2)
Aber die nächste Subscriptionsversion kommt bestimmt!
Gruß Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 30.11.2007 ▲ |
| |
|
AntwortenThemenoptionen | 2.725 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |