summaryrefslogtreecommitdiff
path: root/glflag.mod/glflag.bmx
diff options
context:
space:
mode:
Diffstat (limited to 'glflag.mod/glflag.bmx')
-rw-r--r--glflag.mod/glflag.bmx184
1 files changed, 88 insertions, 96 deletions
diff --git a/glflag.mod/glflag.bmx b/glflag.mod/glflag.bmx
index 5b62530..e0993cf 100644
--- a/glflag.mod/glflag.bmx
+++ b/glflag.mod/glflag.bmx
@@ -12,16 +12,27 @@ Import pub.OpenGL
Strict
-Type GLFlag
+Type TGLFlag
+ ' These are public and can be used to modify the flag
+ '
+ Field xpos:Float
+ Field ypos:Float
+ Field zpos:Float
+ Field xrot:Float
+ Field yrot:Float
+ Field zrot:Float
+
' These are considered private
'
- Const THRESHOLD:Float=0.0001
- Field v:GLFlagVertex[,]
+ Global static:Int=False
+ Global si:Float[]=Null
+ Field v:TGLFlagVertex[,]
+ Field cell:Int
+ Field move:Int
Field width:Int
Field height:Int
Field txt:Int
- Field zpos:Float
' Creates a new flag
'
@@ -34,20 +45,36 @@ Type GLFlag
'
' Returns null for invalid parameters.
'
- Function Create:GLFlag(texture:Int, horiz:Int, vert:Int, size:Float, tile:Int, z:Float)
- Local o:GLFlag
+ Function Create:TGLFlag(texture:Int, horiz:Int, vert:Int, size:Float, tile:Int, z:Float)
+ Local o:TGLFlag
If (horiz<2 Or vert<2)
Return Null
EndIf
- o=New GLFlag
+ o=New TGLFlag
- o.txt=texture
+ If (Not o.static)
+ o.si=New Float[3600]
+ For Local a:Float=0 Until 3600
+ o.si[a]=Sin(a/10)
+ Next
+ o.static=True
+ EndIf
+
+ o.xpos=0
+ o.ypos=0
o.zpos=z
+ o.xrot=0
+ o.yrot=0
+ o.zrot=0
+
+ o.txt=texture
o.width=horiz
o.height=vert
- o.v=New GLFlagVertex[horiz,vert]
+ o.cell=size
+ o.move=size/2
+ o.v=New TGLFlagVertex[horiz,vert]
Local ox:Float
Local oy:Float
@@ -57,8 +84,10 @@ Type GLFlag
For Local x=0 Until horiz
For Local y=0 Until vert
- Local v:GLFlagVertex=New GLFlagVertex
- v.Set(ox+x*size,oy+y*size,0)
+ Local v:TGLFlagVertex=New TGLFlagVertex
+ v.x=ox+x*size
+ v.y=oy+y*size
+ v.z=0
If (tile)
v.u=(x&1)
@@ -77,122 +106,85 @@ Type GLFlag
' Call to render the flag
'
- ' dampen - Scale to dampen movements by when bouncing movement
- ' friction - Scale to slow down movements
- '
- Method Render(dampen:Float=1.0, friction:Float=0.95)
+ Method Render()
glPushMatrix()
- glTranslatef(0,0,zpos)
+ glTranslatef(xpos,ypos,zpos)
+ glRotatef(xrot,1,0,0)
+ glRotatef(yrot,0,1,0)
+ glRotatef(zrot,0,0,1)
glBindTexture(GL_TEXTURE_2D,txt)
- For Local vert:GLFlagVertex=EachIn v
- If (vert.xi<>0 Or vert.yi<>0 Or vert.zi<>0)
- Local s:Float
-
- s=Sgn(vert.xi)
- vert.xi:*friction
- If (Abs(vert.xi)<THRESHOLD)
- vert.initxi=vert.initxi*dampen
- If (vert.initxi<THRESHOLD)
- vert.xi=0
- vert.x=vert.initx
- Else
- vert.xi=-s*vert.initxi*2
- EndIf
- Else
- vert.x:+vert.xi
- EndIf
-
- s=Sgn(vert.yi)
- vert.yi:*friction
- If (Abs(vert.yi)<THRESHOLD)
- vert.inityi=vert.inityi*dampen
- If (vert.inityi<THRESHOLD)
- vert.yi=0
- vert.y=vert.inity
- Else
- vert.yi=-s*vert.inityi*2
- EndIf
- Else
- vert.y:+vert.yi
- EndIf
-
- s=Sgn(vert.zi)
- vert.zi:*friction
- If (Abs(vert.zi)<THRESHOLD)
- vert.initzi=vert.initzi*dampen
- If (vert.initzi<THRESHOLD)
- vert.zi=0
- vert.z=vert.initx
- Else
- vert.zi=-s*vert.initzi*2
- EndIf
- Else
- vert.z:+vert.zi
- EndIf
- EndIf
+ For Local vert:TGLFlagVertex=EachIn v
+ vert.ax=(vert.ax+vert.aix) Mod 3600
+ vert.ay=(vert.ay+vert.aiy) Mod 3600
+ vert.az=(vert.az+vert.aiz) Mod 3600
+ vert.cx=vert.x+si[vert.ax]*move
+ vert.cy=vert.y+si[vert.ay]*move
+ vert.cz=vert.z+si[vert.az]*move
Next
For Local x:Int=0 Until width-1
glBegin(GL_TRIANGLE_STRIP)
For Local y:Int=0 Until height
glTexCoord2f(v[x,y].u,v[x,y].v)
- glVertex3f(v[x,y].x,v[x,y].y,v[x,y].z)
+ glVertex3f(v[x,y].cx,v[x,y].cy,v[x,y].cz)
glTexCoord2f(v[x+1,y].u,v[x+1,y].v)
- glVertex3f(v[x+1,y].x,v[x+1,y].y,v[x+1,y].z)
+ glVertex3f(v[x+1,y].cx,v[x+1,y].cy,v[x+1,y].cz)
Next
glEnd()
Next
glPopMatrix()
End Method
+ ' Sets the amount of movement for vertex movement (defaults to half the cell size)
+ '
+ Method SetMove(m:Int)
+ move=m
+ End Method
+
' Sets the movements for a vertex
'
' x - The X co-ord of the vertex
' y - The Y co-ord of the vertex
- ' xi - The X movement
- ' yi - The Y movement
- ' zi - The Z movement
+ ' angz - The initial angle (movement is done on a sine wave with 3600 positions) for the Z co-ord
+ ' angiz - The angle increment for the Z co-ord
+ ' angx - Ditto for X
+ ' angix - Ditto for X
+ ' angy - And Y
+ ' angiy - And Y
'
- Method Nudge(x:Int, y:Int, xi:Float, yi:Float, zi:Float)
- v[x,y].initxi=Abs(xi)
- v[x,y].inityi=Abs(yi)
- v[x,y].initzi=Abs(zi)
- v[x,y].xi=xi
- v[x,y].yi=yi
- v[x,y].zi=zi
+ ' Note increments must be positive - to simulate negative ones pass a large increment (eg. 3599 for -1)
+ '
+ Method Nudge(x:Int, y:Int, angz:Float, angiz:Float=10, angx:Float=0, angix:Float=0, angy:Float=0, angiy:Float=0)
+ v[x,y].ax=angx
+ v[x,y].ay=angy
+ v[x,y].az=angz
+ v[x,y].aix=angix
+ v[x,y].aiy=angiy
+ v[x,y].aiz=angiz
End Method
End Type
-Type GLFlagVertex
+Type TGLFlagVertex
Field x#,y#,z#
+ Field cx#,cy#,cz#
Field u#,v#
- Field initx#,inity#,initz#
- Field initxi#,inityi#,initzi#
- Field xi#,yi#,zi#
+ Field ax#,ay#,az#
+ Field aix#,aiy#,aiz#
Method New()
x=0
y=0
z=0
- initx=0
- inity=0
- initz=0
- initxi=0
- inityi=0
- initzi=0
- xi=0
- yi=0
- zi=0
- End Method
-
- Method Set(xc:Float, yc:Float, zc:Float)
- x=xc
- initx=xc
- y=yc
- inity=yc
- z=zc
- initz=zc
+ cx=0
+ cy=0
+ cz=0
+ ax=0
+ ay=0
+ az=0
+ aix=0
+ aiy=0
+ aiz=0
End Method
End Type \ No newline at end of file