Code: Select all
EnableExplicit
Structure SPRITE_LAYER
Layer.i
StructureUnion
LayerPivot.i
LayerRoll.i
LayerZoom.i
EndStructureUnion
StructureUnion
LayerOffset.i
EndStructureUnion
StructureUnion
LayerPosition.i
EndStructureUnion
Mesh.i
Material.i
Texture.i
*ParentView.SPRITE_VIEW
x.f
y.f
ZoomX.f
ZoomY.f
Hidden.b
EndStructure
Structure SPRITE_VIEW
View.i
StructureUnion
ViewPivot.i
EndStructureUnion
StructureUnion
ViewOffset.i
EndStructureUnion
StructureUnion
ViewPosition.i
ViewRoll.i
EndStructureUnion
Camera.i
Map ChildLayers.i()
OffsetX.f
OffsetY.f
ScaleX.f
ScaleY.f
EndStructure
Structure SPRITE_ENGINE
Map Views.SPRITE_VIEW()
Map Layers.SPRITE_LAYER()
EndStructure
Global SpriteEngine.SPRITE_ENGINE
Declare FreeLayer(Layer)
Declare FreeView(View)
Enumeration
EndEnumeration
;---------- VIEW
Procedure.i ViewID(View)
ProcedureReturn SpriteEngine\Views(""+View)
EndProcedure
Procedure.i CreateView(View, BackColor=0, StretchMode=#False, x=0, y=0, w=100, h=100)
If View=#PB_Any
Static newObjectNumber=$FFFF
newObjectNumber+103
View=newObjectNumber
AddMapElement(SpriteEngine\Views(), ""+View)
Protected Result=View
Else
If ViewID(View) : FreeView(View) : EndIf
Result=AddMapElement(SpriteEngine\Views(), ""+View)
EndIf
With SpriteEngine\Views()
\View=View
\Camera=CreateCamera(#PB_Any, x, y, w, h)
CameraBackColor(\Camera, BackColor)
CameraRange(\Camera, 0.1, 1000)
CameraProjectionMode(\Camera, #PB_Camera_Orthographic)
SetOrientation(CameraID(\Camera), 1, 0, 0, 0)
Protected hidden=CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 100)), #PB_Material_None)
ScaleEntity(hidden, 100, 100, 0.01)
HideEntity(hidden, 1)
MoveEntity(hidden, 0, 0, 500)
\ViewPivot=CreateNode(#PB_Any)
\ViewOffset=CreateNode(#PB_Any)
\ViewPosition=CreateNode(#PB_Any)
AttachNodeObject(\ViewPosition, CameraID(\Camera))
AttachNodeObject(\ViewOffset, NodeID(\ViewPosition))
AttachNodeObject(\ViewPivot, NodeID(\ViewOffset))
AttachNodeObject(\ViewPivot, EntityID(hidden))
RenderWorld()
If MousePick(\Camera, CameraViewX(\Camera), CameraViewY(\Camera))
\OffsetX=PickX()
\OffsetY=PickY()
If StretchMode
\ScaleX=Abs(PickX()/(ScreenWidth()/2))
\ScaleY=Abs(PickY()/(ScreenHeight()/2))
Else
\ScaleX=Abs(PickX()/(CameraViewWidth(\Camera)/2))
\ScaleY=Abs(PickY()/(CameraViewHeight(\Camera)/2))
EndIf
FreeEntity(hidden)
EndIf
ScaleNode(\ViewOffset, \ScaleX, \ScaleY, 1)
Static newViewPos : newViewPos+$FFFF
MoveNode(\ViewPivot, newViewPos, newViewPos, newViewPos)
ProcedureReturn Result
EndWith
EndProcedure
Procedure FreeView(View)
Protected *View.SPRITE_VIEW=ViewID(View)
ForEach *View\ChildLayers()
FreeLayer(*View\ChildLayers())
Next
FreeCamera(*View\Camera)
FreeNode(*View\ViewPivot)
DeleteMapElement(SpriteEngine\Views(), ""+View)
EndProcedure
Procedure ViewCameraMode(View, RenderMode=#PB_Camera_Textured)
Protected *View.SPRITE_VIEW=ViewID(View)
CameraRenderMode(*View\Camera, RenderMode)
EndProcedure
Procedure MoveView(View, x.f, y.f, Mode=#PB_Relative)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn MoveNode(*View\ViewPosition, x, y, 0, Mode)
EndProcedure
Procedure RollView(View, Angle.f, Mode=#PB_Relative)
Protected *View.SPRITE_VIEW=ViewID(View)
RotateNode(*View\ViewRoll, 0, 0, Angle, Mode)
EndProcedure
Procedure.f ViewRoll(View, Mode=#True)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn NodeRoll(*View\ViewRoll, Mode)
EndProcedure
Procedure.f ViewX(View, Mode=#True)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn NodeX(*View\ViewPosition)
EndProcedure
Procedure.f ViewY(View, Mode=#True)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn NodeY(*View\ViewPosition)
EndProcedure
Procedure.i ViewRectX(View)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn CameraViewX(*View\Camera)
EndProcedure
Procedure.i ViewRectY(View)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn CameraViewY(*View\Camera)
EndProcedure
Procedure.i ViewRectWidth(View)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn CameraViewWidth(*View\Camera)
EndProcedure
Procedure.i ViewRectHeight(View)
Protected *View.SPRITE_VIEW=ViewID(View)
ProcedureReturn CameraViewHeight(*View\Camera)
EndProcedure
;---------- LAYER
Procedure.i LayerID(Layer)
ProcedureReturn SpriteEngine\Layers(""+Layer)
EndProcedure
Procedure.i CreateLayer(Layer, View, SpriteTexture)
If Layer=#PB_Any
Static newObjectNumber=$FFFF
newObjectNumber+103
Layer=newObjectNumber
AddMapElement(SpriteEngine\Layers(), ""+Layer)
Protected Result=Layer
Else
If LayerID(Layer) : FreeLayer(Layer) : EndIf
Result=AddMapElement(SpriteEngine\Layers(), ""+Layer)
EndIf
With SpriteEngine\Layers()
\Layer=Layer
\Texture=SpriteTexture
\Material=CreateMaterial(#PB_Any, TextureID(\Texture))
MaterialFilteringMode(\Material, #PB_Material_None)
MaterialCullingMode(\Material, #PB_Material_NoCulling)
DisableMaterialLighting(\Material, #True)
\Mesh=CreateMesh(#PB_Any, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
SetMeshMaterial(\Mesh, MaterialID(\Material))
MeshVertexPosition(0, 0, 0)
MeshVertexTextureCoordinate(0, 0)
MeshVertexNormal(0, 0, 0)
MeshVertexTangent(0, 0, 0)
MeshVertexColor($FFFFFF)
MeshVertexPosition(1, 0, 0)
MeshVertexPosition(1, 1, 0)
MeshFace(0, 1, 2)
FinishMesh(0)
\LayerPosition=CreateNode(#PB_Any)
\LayerOffset=CreateNode(#PB_Any)
\LayerPivot=CreateNode(#PB_Any)
AttachNodeObject(\LayerPosition, MeshID(\Mesh))
AttachNodeObject(\LayerOffset, NodeID(\LayerPosition))
AttachNodeObject(\LayerPivot, NodeID(\LayerOffset))
\ParentView=ViewID(View)
\ParentView\ChildLayers(""+Layer)=Layer
AttachNodeObject(\ParentView\ViewPivot, NodeID(\LayerPivot))
MoveNode(\LayerOffset, \ParentView\OffsetX, \ParentView\OffsetY, 500)
ScaleNode(\LayerOffset, \ParentView\ScaleX, \ParentView\ScaleY, 1)
ProcedureReturn Result
EndWith
EndProcedure
Procedure FreeLayer(Layer)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
*Layer\ParentView\ChildLayers(""+Layer)=0
DeleteMapElement(*Layer\ParentView\ChildLayers())
FreeNode(*Layer\LayerPivot)
FreeNode(*Layer\LayerOffset)
FreeNode(*Layer\LayerPosition)
FreeMesh(*Layer\Mesh)
FreeMaterial(*Layer\Material)
DeleteMapElement(SpriteEngine\Layers(), ""+Layer)
EndProcedure
Procedure HideLayer(Layer, State)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
With *Layer
If \Hidden<>Bool(State)
\Hidden=Bool(State)
If \Hidden
DetachNodeObject(\LayerPosition, MeshID(\Mesh))
Else
AttachNodeObject(\LayerPosition, MeshID(\Mesh))
EndIf
EndIf
EndWith
EndProcedure
Procedure MoveLayer(Layer, x.f, y.f, Mode=#PB_Relative)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
If Mode = #PB_Relative
*Layer\x+x
*Layer\y+y
Else
*Layer\x=x
*Layer\y=y
EndIf
MoveNode(*Layer\LayerPosition, x, y, 0, Mode)
EndProcedure
Procedure RollLayer(Layer, Angle.f, Mode=#PB_Relative)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
RotateNode(*Layer\LayerRoll, 0, 0, Angle, Mode)
EndProcedure
Procedure ZoomLayer(Layer, ZoomX.f, ZoomY.f, Mode=#PB_Relative)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
If Mode=#PB_Relative
*Layer\ZoomX+ZoomX
*Layer\ZoomY+ZoomY
Else
*Layer\ZoomX=ZoomX
*Layer\ZoomY=ZoomY
EndIf
ScaleNode(*Layer\LayerZoom, ZoomX, ZoomY, 1, Mode)
EndProcedure
Procedure.i LayerHidden(Layer)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
ProcedureReturn *Layer\Hidden
EndProcedure
Procedure.f LayerX(Layer)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
ProcedureReturn *Layer\x
EndProcedure
Procedure.f LayerY(Layer)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
ProcedureReturn *Layer\y
EndProcedure
Procedure.f LayerRoll(Layer, Mode=#True)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
ProcedureReturn NodeRoll(*Layer\LayerRoll, Mode)
EndProcedure
Procedure.f LayerZoomX(Layer)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
ProcedureReturn *Layer\ZoomX
EndProcedure
Procedure.f LayerZoomY(Layer)
Protected *Layer.SPRITE_LAYER=LayerID(Layer)
ProcedureReturn *Layer\ZoomY
EndProcedure
Procedure RenderSprites()
ForEach SpriteEngine\Layers()
With SpriteEngine\Layers()
Protected w=512, h=512
UpdateMesh(\Mesh, 0)
MeshVertexPosition(0, 0, 0)
MeshVertexTextureCoordinate(0, 0)
MeshVertexColor(RGBA(255, 0, 0, 255))
MeshVertexPosition(w, 0, 0)
MeshVertexTextureCoordinate(1, 0)
MeshVertexColor(RGBA(255, 255, 255, 255))
MeshVertexPosition(w, h, 0)
MeshVertexTextureCoordinate(1, 1)
MeshVertexColor(RGBA(255, 255, 255, 255))
MeshVertexPosition(0, h, 0)
MeshVertexTextureCoordinate(0, 1)
MeshVertexColor(RGBA(255, 255, 255, 255))
MeshFace(0, 1, 2)
MeshFace(2, 3, 0)
FinishMesh(0)
EndWith
Next
EndProcedure
; ********************
; EXAMPLE - SPRITE
; ********************
CompilerIf #PB_Compiler_IsMainFile
DisableExplicit
InitEngine3D()
InitSprite()
AntialiasingMode(#PB_AntialiasingMode_None)
win=OpenWindow(#PB_Any, 0, 0, 800, 600, "Create QUAD mesh", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(win), 0, 0, WindowWidth(win), WindowHeight(win))
w=512
h=512
spriteAtlas=CreateTexture(#PB_Any, w, h)
If StartDrawing(TextureOutput(spriteAtlas))
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(RGB(162, 75, 51))
FrontColor(RGB(71, 162, 51))
CircularGradient(w, h, w/2)
Box(0, 0, w, h)
DrawingMode(#PB_2DDrawing_Default)
Circle(400, 300, 5, RGB(116, 45, 45))
Circle(400*0.94, 300*0.94, 5, RGB(16, 145, 95))
Plot(0, 1, 0)
Plot(1, 0, 0)
Plot(0, 3, 0)
Plot(3, 0, 0)
Plot(511, 510, 0)
Plot(510, 511, 0)
StopDrawing()
EndIf
backView=CreateView(#PB_Any, RGB(105, 114, 131))
backLayer=CreateLayer(#PB_Any, backView, spriteAtlas)
ViewCameraMode(backView, #PB_Camera_Wireframe)
view=CreateView(#PB_Any, RGB(0, 79, 229), 0, 5, 5, 94, 94)
layer=CreateLayer(#PB_Any, view, spriteAtlas)
Debug "LAYER x="+LayerX(Layer)+" y="+LayerY(Layer)
Repeat
MoveView(View, -5+Random(10), -5+Random(10), #PB_Absolute)
t.f+0.1
zoom.f=1-Abs(0.1*Sin(t))
ZoomLayer(layer, zoom, zoom, #PB_Absolute)
RollLayer(layer, 0.5)
If LayerRoll(layer)> 160
If Not LayerHidden(layer)
Debug "HIDE LAYER angle="+LayerRoll(Layer)
HideLayer(Layer, 1)
EndIf
EndIf
If LayerRoll(layer)< 0
If LayerHidden(layer)
Debug "SHOW LAYER angle="+LayerRoll(Layer)
HideLayer(Layer, 0)
EndIf
EndIf
RenderSprites()
RenderWorld()
FlipBuffers()
Until WaitWindowEvent(1)=#PB_Event_CloseWindow
FreeView(view)
End
CompilerEndIf