Test3D - perfect pixel camera, Layer,View

Share your advanced PureBasic knowledge/code with the community.
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Test3D - perfect pixel camera, Layer,View

Post by eddy »

:arrow: There's a new version here: http://www.purebasic.fr/english/viewtop ... 40&t=56507

Code: Select all

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, 800, 600)

cam=CreateCamera(#PB_Any, 0, 0, 100, 100)
CameraRange(cam, 0.1, 1000)
CameraBackColor(cam, RGB(255, 55, 0))
CameraProjectionMode(cam, #PB_Camera_Orthographic)

w=512
h=512

tex=CreateTexture(#PB_Any, w, h)
If StartDrawing(TextureOutput(tex))
   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)
   Plot(0, 1, 0)
   Plot(1, 0, 0)
   Plot(0, 3, 0)
   Plot(3, 0, 0)
   StopDrawing()
EndIf
mat=CreateMaterial(#PB_Any, TextureID(tex))
MaterialFilteringMode(mat, #PB_Material_None)
MaterialCullingMode(mat, #PB_Material_NoCulling)
DisableMaterialLighting(mat, #True)

m=CreateMesh(#PB_Any);, #PB_Mesh_TriangleList,#PB_Mesh_Dynamic)
MeshVertexPosition(0, 0, 0)
MeshVertexTextureCoordinate(0, 0)
MeshVertexColor(RGBA(255, 255, 255, 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(1)

e=CreateEntity(#PB_Any, MeshID(m), MaterialID(mat), 0, 0, -500)
RotateEntity(e, 180, 0, 0, #PB_Relative)

hidden=CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 100)), #PB_Material_None, 0, 0, -500)
ScaleEntity(hidden, 100, 100, 0.01)
HideEntity(hidden, 1)

RenderWorld()
If MousePick(cam, 0, 0)
   zx.d=Abs(PickX()/(ScreenWidth()/2))
   zy.d=Abs(PickY()/(ScreenHeight()/2))
   FreeEntity(hidden)
EndIf

posX.f=1.0
posY.f=1.0
TransformMesh(m, (-ScreenWidth()/2.0+posX)*zx, (-ScreenHeight()/2.0+posY)*zy, 0, zx, zy, 1, 0, 0, 0)
Repeat
   RenderWorld()
   FlipBuffers()
Until WaitWindowEvent(1)=#PB_Event_CloseWindow
Last edited by eddy on Tue Sep 10, 2013 7:57 pm, edited 4 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: test 3D - perfect pixel camera

Post by eddy »

version with Dynamic mesh and Node

Code: Select all

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))

cam=CreateCamera(#PB_Any, 0, 0, 100, 100)
CameraProjectionMode(cam, #PB_Camera_Orthographic)
CameraRange(cam, 0.1, 1000)
CameraBackColor(cam, RGB(255, 55, 0))
RotateCamera(cam, 180, 0, 0)

hidden=CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 100)), #PB_Material_None, 0, 0, 500)
ScaleEntity(hidden, 100, 100, 0.01)
HideEntity(hidden, 1)
RenderWorld()
If MousePick(cam, 0, 0)
   zx.f=Abs(PickX()/(ScreenWidth()/2))
   zy.f=Abs(PickY()/(ScreenHeight()/2))
   FreeEntity(hidden)
EndIf


w=512
h=512

tex=CreateTexture(#PB_Any, w, h)
If StartDrawing(TextureOutput(tex))
   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)
   Plot(0, 1, 0)
   Plot(1, 0, 0)
   Plot(0, 3, 0)
   Plot(3, 0, 0)
   StopDrawing()
EndIf
mat=CreateMaterial(#PB_Any, TextureID(tex))
MaterialFilteringMode(mat, #PB_Material_None)
MaterialCullingMode(mat, #PB_Material_NoCulling)
DisableMaterialLighting(mat, #True)

m=CreateMesh(#PB_Any, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)

MeshVertexPosition(0, 0, 0)
MeshVertexTextureCoordinate(0, 0)
MeshVertexColor(RGBA(255, 255, 255, 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)

;UpdateMesh(m, 0)
;MeshIndex(1)
;MeshVertexPosition(w+100, 0, 0)
;FinishMesh(0)

e=CreateNode(#PB_Any, 0, 0, 500)
AttachNodeObject(e, MeshID(m))
SetMeshMaterial(m, MaterialID(mat))

posX.f=1.0
posY.f=1.0
MoveNode(e, (-ScreenWidth()/2.0+posX)*zx, (-ScreenHeight()/2.0+posY)*zy, 0)
ScaleNode(e, zx, zy, 1)

Repeat
   RenderWorld()
   FlipBuffers()
Until WaitWindowEvent(1)=#PB_Event_CloseWindow
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: test 3D - perfect pixel camera

Post by IdeasVacuum »

Hi Eddy -not sure what to do with your examples - they look the same when I run them, just static images?
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: test 3D - perfect pixel camera

Post by eddy »

IdeasVacuum wrote:Hi Eddy -not sure what to do with your examples - they look the same when I run them, just static images?
yeah
This kind of code is usefull for sprite rendering

Image
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: test 3D - perfect pixel camera : Layer, View

Post by eddy »

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 
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
Post Reply