Page 1 of 1

Test3D - perfect pixel camera, Layer,View

Posted: Tue Aug 13, 2013 2:06 am
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

Re: test 3D - perfect pixel camera

Posted: Tue Aug 13, 2013 9:26 pm
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

Re: test 3D - perfect pixel camera

Posted: Tue Aug 13, 2013 10:19 pm
by IdeasVacuum
Hi Eddy -not sure what to do with your examples - they look the same when I run them, just static images?

Re: test 3D - perfect pixel camera

Posted: Tue Aug 13, 2013 10:55 pm
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

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

Posted: Fri Aug 16, 2013 1:59 am
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