gambas-source-code/app/examples/OpenGL/PDFPresentation/.src/CPdfPresentation.class
Benoît Minisini d050bcab25 [CONFIGURATION]
* 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
2015-01-11 23:41:41 +00:00

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