d050bcab25
* NEW: Modify the installation process so that it will be able to run the 'gbh3' tool to extract help from component source files. Not usable yet as long as 'gbh3' depends on 'gb.pcre'. [HELP EXTRACTOR] * NEW: Move 'gbh3' project from '/app/src' to '/main/tools'. * NEW: Add new options that are needed by the installation process. git-svn-id: svn://localhost/gambas/trunk@6829 867c0c6c-44f3-4631-809d-bfa615b0a4ec
464 lines
9.1 KiB
Text
464 lines
9.1 KiB
Text
' Gambas class file
|
|
|
|
' no effect
|
|
Public Const NoEffect As Integer = 0
|
|
Public Const Rotate As Integer = 1
|
|
Public Const FadingIn As Integer = 2
|
|
Public Const FadingOut As Integer = 3
|
|
|
|
' do we animate the page ?
|
|
Private anim As Boolean
|
|
Private aEffect As Integer
|
|
Private nextEffect As Integer
|
|
' do we move to previous page ?
|
|
Private previous As Boolean
|
|
' keep trace of zTrans for rotate
|
|
Private azTrans As Float
|
|
' fading
|
|
Private aColor As Float = 0
|
|
|
|
' texture
|
|
Private textures As New Integer[]
|
|
Private TextureSize As Integer
|
|
Private textureShown As Integer
|
|
' the size of the shown quad
|
|
Private qHeight As Float = 1
|
|
Private qWidth As Float
|
|
' the size of the shown texture
|
|
Private tHeight As Float
|
|
Private tWidth As Float
|
|
Private tX As Float = 0
|
|
Private tY As Float = 0
|
|
|
|
' document pdf
|
|
Private hPdf As New PdfDocument
|
|
Private currentPage As Integer
|
|
Private quality As Integer = 1
|
|
Private initialized As Boolean = False
|
|
|
|
' camera position
|
|
Private Ztrans As Float = -2.56
|
|
Private Ytrans As Float = 0.0
|
|
Private Xtrans As Float = 0.0
|
|
Private Zrot As Float = 0.0
|
|
Private Yrot As Float = 1.0
|
|
Private Xrot As Float = 0.0
|
|
Private Angle As Float = 0
|
|
Private ZoomFactor As Float = 1.0
|
|
Private GotoZoomFactor As Float = ZoomFactor
|
|
|
|
' flag values
|
|
Private points As New Float[45, 45, 3]
|
|
Private hold As Float
|
|
Private wiggle_count As Integer
|
|
Private DrawFlag As Boolean = False
|
|
|
|
' speed factor
|
|
Private $eSpeed As Float
|
|
|
|
' properties
|
|
Property Effect As Integer
|
|
Property Read Page As Integer
|
|
|
|
' Image cache
|
|
'PRIVATE $cImageCache AS NEW Collection
|
|
|
|
Public Sub _new(file As String, FrameRate As Integer)
|
|
|
|
Dim width, height As Integer
|
|
Dim x, y As Integer
|
|
Dim i As Float
|
|
|
|
hPdf.Open(file)
|
|
aEffect = noEffect
|
|
currentPage = 1
|
|
textureShown = 1
|
|
hPdf.Zoom = quality
|
|
width = hPdf[currentPage].width
|
|
height = hPdf[currentPage].height
|
|
qWidth = Width / Height
|
|
textureSize = getTextureSize(Max(Width, Height))
|
|
tWidth = Width / textureSize
|
|
tHeight = Height / textureSize
|
|
azTrans = zTrans
|
|
|
|
$eSpeed = 600 / FrameRate
|
|
|
|
music.Load("music.xm")
|
|
|
|
For x = 0 To 44
|
|
For y = 0 To 44
|
|
Points[x, y, 0] = ((x / 5) - 4.5)
|
|
Points[x, y, 1] = ((y / 5) - 4.5)
|
|
Points[x, y, 2] = Sin((((x / 5) * 40) / 360) * Pi * 2) * 0.2
|
|
Next
|
|
Next
|
|
|
|
End
|
|
|
|
Public Sub _free()
|
|
|
|
Gl.DeleteTextures(textures)
|
|
|
|
End
|
|
|
|
Public Sub Draw()
|
|
|
|
If initialized = False Then
|
|
initialize()
|
|
initialized = True
|
|
anim = True
|
|
aEffect = fadingIn
|
|
nextEffect = rotate
|
|
Endif
|
|
|
|
If Anim Then animate()
|
|
|
|
Paint()
|
|
|
|
End
|
|
|
|
Public Sub Resize(W As Integer, H As Integer)
|
|
|
|
' Width/Height Ratio
|
|
Dim ratio As Float
|
|
Dim Height As Integer
|
|
|
|
Height = H
|
|
' Protect against a divide by zero
|
|
|
|
If Height = 0 Then Height = 1
|
|
|
|
ratio = W / Height
|
|
' Setup our viewport
|
|
Gl.Viewport(0, 0, W, H)
|
|
' change to the projection matrix AND set our viewing volume.
|
|
Gl.MatrixMode(Gl.PROJECTION)
|
|
Gl.LoadIdentity()
|
|
' Set our perspective
|
|
Glu.Perspective(45.0, ratio, 0.1, 100.0)
|
|
' Make sure we're changing the model view and not the projection
|
|
Gl.MatrixMode(Gl.MODELVIEW)
|
|
GL.LoadIdentity()
|
|
|
|
End
|
|
|
|
Public Sub MoveNext()
|
|
|
|
' we animate the page, no moves until end !
|
|
If anim Then Return
|
|
|
|
' No more page
|
|
If currentPage + 1 > hPdf.Count Then Return
|
|
|
|
Inc (currentPage)
|
|
If currentPage = hPdf.Count Then
|
|
aEffect = fadingOut
|
|
music.Play(-1)
|
|
Endif
|
|
previous = False
|
|
anim = True
|
|
|
|
End
|
|
|
|
Public Sub MovePrev()
|
|
|
|
' we animate the page, no moves until end !
|
|
If anim Then Return
|
|
|
|
' No more page
|
|
If currentPage = 1 Then Return
|
|
If currentPage = hPdf.Count Then Return
|
|
|
|
Dec (currentPage)
|
|
previous = True
|
|
azTrans = zTrans
|
|
anim = True
|
|
|
|
End
|
|
|
|
Function Effect_Read() As Integer
|
|
|
|
Return aEffect
|
|
|
|
End
|
|
|
|
Sub Effect_Write(ceffect As Integer)
|
|
|
|
aEffect = ceffect
|
|
|
|
End
|
|
|
|
Function Page_Read() As Integer
|
|
|
|
Return currentPage
|
|
|
|
End
|
|
|
|
'************************ private functions**********************
|
|
|
|
Private Sub initialize()
|
|
|
|
' Enable texturing
|
|
Gl.Enable(Gl.TEXTURE_2D)
|
|
' Enable smooth shading
|
|
Gl.ShadeModel(Gl.SMOOTH)
|
|
' Set the background black
|
|
Gl.ClearColor(0.0, 0.0, 0.0, 1.0)
|
|
' Depth buffer setup
|
|
Gl.ClearDepth(1.0)
|
|
' Enables Depth Testing
|
|
Gl.Enable(Gl.DEPTH_TEST)
|
|
' The Type OF Depth Test TO DO
|
|
Gl.DepthFunc(Gl.LESS)
|
|
' Really Nice Perspective Calculations
|
|
Gl.Hint(Gl.PERSPECTIVE_CORRECTION_HINT, Gl.NICEST)
|
|
Gl.Disable(Gl.BLEND)
|
|
|
|
textures = Gl.GenTextures(3)
|
|
loadTexture(textures[textureshown], 1)
|
|
|
|
If hPdf.Count > 1 Then loadTexture(textures[textureshown + 1], 2)
|
|
|
|
End
|
|
|
|
Private Sub Paint()
|
|
|
|
Dim x As Integer
|
|
Dim y As Integer
|
|
Dim f_x As Float
|
|
Dim f_y As Float
|
|
Dim f_xb As Float
|
|
Dim f_yb As Float
|
|
|
|
If ZoomFactor < GotoZoomFactor Then
|
|
ZoomFactor = Min(GotoZoomFactor, ZoomFactor * (1.2 ^ (1 / 4)))
|
|
Else If ZoomFactor > GotoZoomFactor Then
|
|
ZoomFactor = Max(GotoZoomFactor, ZoomFactor / (1.2 ^ (1 / 4)))
|
|
Endif
|
|
|
|
gl.Clear(gl.COLOR_BUFFER_BIT Or gl.DEPTH_BUFFER_BIT)
|
|
' Reset The View
|
|
gl.LoadIdentity()
|
|
|
|
If DrawFlag Then
|
|
gl.Translatef(0.80, -1.9, -8.0)
|
|
gl.Rotatef(180, 1.0, 0, 0)
|
|
gl.BindTexture(gl.TEXTURE_2D, textures[textureShown])
|
|
|
|
gl.Begin(gl.QUADS)
|
|
|
|
For x = 0 To 43
|
|
For y = 0 To 43
|
|
f_x = x / 44.0
|
|
f_y = y / 44.0
|
|
f_xb = (x + 1) / 44.0
|
|
f_yb = (y + 1) / 44.0
|
|
Gl.TexCoordf(f_x, f_y)
|
|
gl.Vertexf(points[x, y, 0], points[x, y, 1], points[x, y, 2])
|
|
Gl.TexCoordf(f_x, f_yb)
|
|
gl.Vertexf(points[x, y + 1, 0], points[x, y + 1, 1], points[x, y + 1, 2])
|
|
Gl.TexCoordf(f_xb, f_yb)
|
|
gl.Vertexf(points[x + 1, y + 1, 0], points[x + 1, y + 1, 1], points[x + 1, y + 1, 2])
|
|
Gl.TexCoordf(f_xb, f_y)
|
|
gl.Vertexf(points[x + 1, y, 0], points[x + 1, y, 1], points[x + 1, y, 2])
|
|
Next
|
|
Next
|
|
gl.End()
|
|
|
|
If wiggle_count = 2 Then
|
|
For y = 0 To 44
|
|
hold = points[0, y, 2]
|
|
For x = 0 To 43
|
|
points[x, y, 2] = points[x + 1, y, 2]
|
|
Next
|
|
points[44, y, 2] = hold
|
|
Next
|
|
wiggle_count = 0
|
|
Endif
|
|
Inc wiggle_count
|
|
|
|
Else
|
|
|
|
gl.Translatef(0, 0, Ztrans * ZoomFactor)
|
|
gl.Rotatef(angle, 0, Yrot, 0)
|
|
|
|
Gl.BindTexture(Gl.TEXTURE_2D, textures[textureShown])
|
|
|
|
' Draw A Quad
|
|
gl.Begin(gl.QUADS)
|
|
Gl.TexCoordf(tX, tY)
|
|
gl.Vertexf(- qWidth, qHeight, 0.0)
|
|
Gl.TexCoordf(twidth, tY)
|
|
gl.Vertexf(qWidth, qHeight, 0.0)
|
|
Gl.TexCoordf(twidth, theight)
|
|
gl.Vertexf(qWidth, - qHeight, 0.0)
|
|
Gl.TexCoordf(tX, theight)
|
|
gl.Vertexf(- qWidth, - qHeight, 0.0)
|
|
gl.End()
|
|
|
|
Endif
|
|
|
|
End
|
|
|
|
Private Function getTextureSize(size As Integer) As Integer
|
|
|
|
Dim iSize As Integer
|
|
Dim iCount As Integer
|
|
|
|
While (size > isize)
|
|
iSize = 2 ^ iCount
|
|
Inc (iCount)
|
|
Wend
|
|
|
|
Return iSize
|
|
|
|
End
|
|
|
|
Private Sub loadTexture(texture As Integer, page As Integer)
|
|
|
|
Dim imgPage As Image
|
|
|
|
' imgPage = $cImageCache[page]
|
|
' IF NOT imgPage THEN
|
|
Debug "loading pdf page "; page
|
|
imgPage = hPdf[page].Image
|
|
imgPage.Resize(textureSize, textureSize)
|
|
'$cImageCache[page] = imgPage
|
|
'ENDIF
|
|
Gl.BindTexture(Gl.TEXTURE_2D, texture)
|
|
Gl.TexImage2D(imgPage)
|
|
Gl.TexParameteri(Gl.TEXTURE_2D, Gl.TEXTURE_MIN_FILTER, Gl.LINEAR)
|
|
Gl.TexParameteri(Gl.TEXTURE_2D, Gl.TEXTURE_MAG_FILTER, Gl.LINEAR)
|
|
|
|
End
|
|
|
|
Private Sub updatePages()
|
|
|
|
Dim cpage As Integer
|
|
|
|
If previous = False Then
|
|
cpage = textures[0]
|
|
textures.Remove(0)
|
|
textures.Push(cpage)
|
|
If currentPage < hPdf.Count Then
|
|
loadTexture(textures[2], currentPage + 1)
|
|
Endif
|
|
Return
|
|
Endif
|
|
|
|
cpage = textures[2]
|
|
textures.pop()
|
|
textures.Add(cpage, 0)
|
|
If currentPage > 1 Then
|
|
loadTexture(textures[0], currentPage - 1)
|
|
Endif
|
|
|
|
End
|
|
|
|
Private Sub animate()
|
|
|
|
If aEffect = NoEffect Then animNoEffect()
|
|
If aEffect = Rotate Then animRotate()
|
|
If aEffect = FadingIn Then animFadingIn()
|
|
If aEffect = FadingOut Then animFadingOut()
|
|
|
|
End
|
|
|
|
Private Sub animNoEffect()
|
|
|
|
updatePages()
|
|
anim = False
|
|
|
|
End
|
|
|
|
Private Sub animRotate()
|
|
|
|
Dim eOldAngle As Float = angle
|
|
|
|
If previous = False Then
|
|
angle -= 0.5 * $eSpeed
|
|
|
|
If eOldAngle > -90 And If angle <= -90 Then
|
|
tX = tWidth
|
|
tWidth = 0
|
|
Inc (textureShown)
|
|
Endif
|
|
|
|
If angle < -180 Then
|
|
angle = 0
|
|
anim = False
|
|
tWidth = tX
|
|
tX = 0
|
|
zTrans = azTrans
|
|
updatePages()
|
|
textureShown = 1
|
|
Endif
|
|
Else
|
|
angle += 0.5 * $eSpeed
|
|
|
|
If eOldAngle < 90 And If angle >= 90 Then
|
|
tX = tWidth
|
|
tWidth = 0
|
|
Dec (textureShown)
|
|
Endif
|
|
|
|
If angle > 180 Then
|
|
angle = 0
|
|
anim = False
|
|
tWidth = tX
|
|
tX = 0
|
|
zTrans = azTrans
|
|
updatePages()
|
|
textureShown = 1
|
|
Endif
|
|
Endif
|
|
|
|
zTrans = azTrans - 2 * Sin(Abs(Rad(angle)))
|
|
|
|
End
|
|
|
|
Private Sub animFadingIn()
|
|
|
|
aColor += 0.02 * $eSpeed
|
|
|
|
If aColor > 1 Then
|
|
Gl.Colorf(1.0, 1.0, 1.0)
|
|
aColor = 1
|
|
aEffect = nextEffect
|
|
anim = False
|
|
Else
|
|
Gl.Colorf(aColor, aColor, aColor)
|
|
Endif
|
|
|
|
End
|
|
|
|
Private Sub animFadingOut()
|
|
|
|
aColor -= 0.01 * $eSpeed
|
|
|
|
If aColor < 0 Then
|
|
Gl.Colorf(0.0, 0.0, 0.0)
|
|
aColor = 0
|
|
aEffect = FadingIn
|
|
updatePages()
|
|
DrawFlag = True
|
|
Else
|
|
Gl.Colorf(aColor, aColor, aColor)
|
|
Endif
|
|
|
|
End
|
|
|
|
Public Sub ZoomIn()
|
|
|
|
If GotoZoomFactor <= 0.04 Then Return
|
|
GotoZoomFactor /= 1.2
|
|
|
|
End
|
|
|
|
Public Sub ZoomOut()
|
|
|
|
If GotoZoomFactor > 20 Then Return
|
|
GotoZoomFactor *= 1.2
|
|
|
|
End
|