Page 1 of 2

Sprite3D engine [DX9]

Posted: Wed Mar 18, 2009 2:08 am
by eddy
I'm coding a new sprite3D engine based on Ogre engine.

- open source
- engine : ogre 3D, purebasic commands
- cross-platform : yes probably
- sprite3D features :
  • alpha
  • color
  • gradient, rainbow gradient
  • handle
  • shaped sprite (disc, ring, dotring, triangle, sliced ) 80%
  • sprite particles 50%
  • blending
  • filtering
  • mirrored sprite
  • deformation
  • load image paving
  • load image animation
  • trail 0%
  • text 0%
  • effect 10%
  • zorder
:arrow: download demo (win version) :
v0.4 http://www.datafilehost.com/download-21d7cab2.html
v0.3 http://www.datafilehost.com/download-2c6ea798.html

:arrow: speed test : http://www.datafilehost.com/download-b469d66d.html

Image

original thread :
http://www.purebasic.fr/english/viewtopic.php?t=36684

Posted: Sun Mar 22, 2009 3:06 pm
by eddy
work in progress :
- shape sprite (disc, ring)
- zorder fixed (by using orthographic camera)
- 2D render fixed (by using orthographic camera)
- sprite copy + clone
- garbage collector

problems encountered :
- buggy CreateCamera command :?
- I can't create texture :(

I posted a new demo (v0.2).
Ring sprite + horizontal gradient work great!

Posted: Sun Mar 22, 2009 6:04 pm
by flaith
tested, really nice :D

Posted: Sun Mar 22, 2009 7:30 pm
by eddy
thanks

This is how does the code look like :

Code: Select all

EnableExplicit
XInclude "gs.pb"


#w=800
#h=600
OpenWindow(0, 0, 0, #w, #h, "Press SPACE BAR to change render mode", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, #w, #h, 0, 0, 0)

Add3DArchive(".\", #PB_3DArchive_FileSystem)

gs_CreateCamera(0, 0, #w, #h, RGB(255, 255, 255))

Global s1=gs_CreateSprite(gs_LoadImage("tex.jpg"), 1, 1, #w-2, 300, 6, 6)
gs_SetGradient(s1, #True, RGB(255, 0, 100), RGB(0, 255, 0), 255, 0)
Global *s1.gs_Sprite=s1
AddMaterialLayer(*s1\Image\Material, TextureID(*s1\Image\texture), #PB_Material_AlphaBlend)
ScrollMaterial(*s1\Image\Material, 0.1, 0.1, #PB_Material_Animated, 1)

Global sn=gs_CreateSprite(gs_LoadImage("boule.png"), 200, 50, 100, 100)
gs_SetColor(sn, RGB(255, 0, 0))
gs_SetAlpha(sn, 250)
gs_SetScale(sn, 0.5, 0.5)
gs_SetHandle(sn, 50, 50)
gs_SetZOrder(sn, 10)
Global n
For n=1 To 10
   Global sn_scale.f=0.5+n*0.1
   Global sn_order=(11-n)
   sn=gs_Clone(sn, 25, 25)
   gs_SetZOrder(sn, sn_order)
   gs_SetScale(sn, sn_scale, sn_scale)
   gs_Rotate(sn, 10)
Next

Global sq=gs_CreateShapeSprite(gs_LoadImage("xox.png"), 0, 100, 200, 200, #gs_Shape_Disc, 40)
Global sp=gs_Copy(sq, 100, 100)
gs_SetScale(sp, 3, 1.5)
gs_SetGradient(sp, #False, RGB(255, 255, 0), RGB(0, 255, 255), 200, 500)
Global *s1.gs_Sprite=sp
;AddMaterialLayer(*s1\Image\Material, TextureID(*s1\Image\texture), #PB_Material_AlphaBlend)
;ScrollMaterial(*s1\Image\Material, 0.1, 0.1, #PB_Material_Animated, 1)


Procedure TransformSprites()
   
   Protected Columns, Rows
   
   Protected n, i, j, k
   Static DeformTime.f
   DeformTime+#PI/100
   
   Dim transform.gs_xyzuvc(0)
   gs_GetVertexArray(s1, transform())
   Columns=gs_GetColumns(s1)
   Rows=gs_GetColumns(s1)
   k=Columns+1
   For j=0 To Rows
      If j=0 : Continue : EndIf
      For i=0 To Columns
         n=i+j*k
         transform(n)\y+30*Cos(1*#PI/Columns*i+DeformTime)
      Next
   Next
   gs_SetVertexArray(s1, transform())
   
   Dim transform.gs_xyzuvc(0)
   gs_GetVertexArray(sn, transform())
   Columns=gs_GetColumns(sn)
   Rows=gs_GetColumns(sn)
   k=Columns+1
   For j=0 To Rows
      Protected tt.f=20*Cos(1*#PI/Columns*i+DeformTime)
      For i=0 To Columns
         n=i+j*k
         transform(n)\y+tt
      Next
   Next
   gs_SetVertexArray(sn, transform())
   
   Dim transform.gs_xyzuvc(0)
   gs_GetVertexArray(sp, transform())
   Protected Segments=gs_GetColumns(sp)
   
   Protected op=1
   For i=0 To Segments
      n=i
      op=-op
      Protected zt.f=op*10*Cos(2*#PI/Segments*i+DeformTime)
      transform(n)\y+zt
   Next
   gs_SetVertexArray(sp, transform())
   
   Dim transform.gs_xyzuvc(0)
   gs_GetVertexArray(sq, transform())
   Segments=gs_GetColumns(sq)
   
   zt.f=50*Cos(2*#PI/Segments*i+DeformTime)
   For i=0 To Segments
      n=i      
      transform(n)\y+zt
   Next
   gs_SetVertexArray(sq, transform())
EndProcedure

Repeat
   gs_Rotate(sn, 1)
   ExamineKeyboard()
   If KeyboardReleased(#PB_Key_Space)
      If gs_SwitchCameraRenderMode()=#PB_Camera_Textured
         CameraBackColor(#gs_Camera, RGB(255,255,255))
      Else
         CameraBackColor(#gs_Camera, RGB(5, 5, 55))
      EndIf
   EndIf
   TransformSprites()
   RenderWorld()
   FlipBuffers()
   
Until KeyboardPushed(#PB_Key_Escape) Or WaitWindowEvent(10)=#PB_Event_CloseWindow
gs_FreeCamera()

Posted: Sun Mar 22, 2009 9:37 pm
by blueznl
I assume you keep in an include as opposed to a lib?

Posted: Sun Mar 22, 2009 9:51 pm
by eddy
blueznl wrote:I assume you keep in an include as opposed to a lib?
yes

Posted: Mon Mar 23, 2009 9:05 am
by Violet
I think it's such an awesome idea using OGRE for that. And it's just so simple. To easy, to get the idea. ^^

Posted: Mon Mar 23, 2009 6:56 pm
by Hroudtwolf
Really great. Keep it up!

Posted: Mon Mar 23, 2009 9:29 pm
by eddy
Help ... I need some cool animation for my next tests. (3D animation, 2D effect, ...)
If you have some graphic resource :

- file format PNG
- texture size 512 x 512
- layout 4 columns x 4 rows
- image count > 8

Posted: Wed Mar 25, 2009 1:14 am
by eddy
I posted a new demo (v0.3).
image paving + sprite deformation
image animation + sprite deformation

LoadImagePaving ... Is it clear ? I'm not an expert about naming functions. :roll:

Code: Select all

gs_LoadImageStrip(file.s, Frame=0, Columns=1, Rows=1)
gs_LoadImagePaving(file.s, PavingX.f=1.0, PavingY.f=1.0)
gs_LoadImage(file.s)
P.S: I'll try to post a mac demo to check if it works.

Posted: Wed Mar 25, 2009 4:23 am
by J. Baker
On v0.3 I'm getting an error that there's no disc in my drive when I try to run it for some reason. Will try on my other pc soon.

EDIT: On my other pc I get this...
Image

Posted: Wed Mar 25, 2009 8:27 am
by eddy
oops .. I didn't remove my debug option
[Fixed]

Posted: Fri Mar 27, 2009 12:23 am
by eddy
I noticed you can generate material with .Mat script.
It's such a pity there's no PB command to do the same things. :?
some Shader FX on sprites would be cool. :D

W.I.P
... to give an idea of the lib content

Code: Select all

Procedure gs_CreateCamera(x, y, Width, Height, BackgroundColor=$000000)
Procedure gs_FreeCamera()
Procedure gs_SetCameraRenderMode(RenderMode=#PB_Ignore)
Procedure gs_SetCameraBackgroundColor(BackgroundColor=$000000)

Procedure gs_LoadImageStrip(file.s, Columns=1, Rows=1, Frame=0)
Procedure gs_LoadImagePaving(file.s, PavingX.f=1.0, PavingY.f=1.0)
Procedure gs_LoadImage(file.s)
Procedure gs_CopyImage(Image)
Procedure gs_FreeImage(Image)
Procedure gs_SetImageBlend(Image, BlendMode)
Procedure gs_SetImageFiltering(Image, FilterMode)
Procedure gs_GetImageFrameCount(Image)
Procedure gs_SetImageFrame(Image, Frame)
Procedure gs_GetImageFrame(Image)
Procedure gs_NextImageFrame(Image, Frame, FrameLoop=#True)
Procedure gs_GetImageWidth(Image, GetFrameSize=#True, Frame=#PB_Ignore)
Procedure gs_GetImageHeight(Image, GetFrameSize=#True, Frame=#PB_Ignore)
Procedure gs_AppendImageFrame(Image, FrameX, FrameY, FrameWidth, FrameHeight) ; <--- TODO
Procedure gs_RemoveImageFrame(Image, Frame) ; <--- TODO

Procedure gs_CreateShape(ShapeType, Width, Height, a=0, b=0, c=0, d=0)
Procedure gs_CopyShape(Shape)
Procedure gs_FreeShape(Shape)

Procedure gs_CreateEntity(Image, Shape)
Procedure gs_CreateSlicedSprite(Image, x, y, Width, Height, SliceAngle, SliceDistance) ; <--- TODO
Procedure gs_CreateShapedSprite(Image, x, y, Width, Height, ShapeType, a=#PB_Ignore, b=#PB_Ignore)
Procedure gs_CreateSprite(Image, x, y, Width=#PB_Ignore, Height=#PB_Ignore, Columns=1, Rows=1)
Procedure gs_Clone(Sprite, OffsetX=0, OffsetY=0, ZOrder=#PB_Ignore)
Procedure gs_Copy(Sprite, OffsetX=0, OffsetY=0, ZOrder=#PB_Ignore)
Procedure gs_FreeSprite(Sprite)

Procedure gs_SetFrame(Sprite, Frame)
Procedure gs_GetFrame(Sprite)
Procedure gs_Show(Sprite)
Procedure gs_Hide(Sprite)
Procedure gs_Move(Sprite, x, y, mode=#PB_Absolute)
Procedure gs_Rotate(Sprite, angle)
Procedure gs_SetPosition(Sprite, x, y)
Procedure gs_GetPositionX(Sprite)
Procedure gs_GetPositionY(Sprite)
Procedure gs_SetZOrder(Sprite, ZOrder)
Procedure gs_GetZOrder(Sprite)
Procedure gs_SetHandle(Sprite, HandleX, HandleY)
Procedure gs_GetHandleX(Sprite)
Procedure gs_GetHandleY(Sprite)
Procedure gs_SetAngle(Sprite, Angle)
Procedure gs_GetAngle(Sprite)
Procedure gs_SetScale(Sprite, ScaleX.f=1, ScaleY.f=1)
Procedure.f gs_GetScaleX(Sprite)
Procedure.f gs_GetScaleY(Sprite)
Procedure gs_SetSize(Sprite, Width, Height)
Procedure gs_SetWidth(Sprite, Width)
Procedure gs_GetWidth(Sprite)
Procedure gs_SetHeight(Sprite, Height)
Procedure gs_GetHeight(Sprite)
Procedure gs_SetColor(Sprite, Color=$FFFFFF)
Procedure gs_GetColor(Sprite)
Procedure gs_SetAlpha(Sprite, Alpha=255)
Procedure gs_GetAlpha(Sprite)
Procedure gs_SetGradient(Sprite, Vertical, Color1, Color2, Alpha1=255, Alpha2=255)
Procedure gs_SetVisibility(Sprite, Visible)
Procedure gs_GetVisibility(Sprite)
Procedure gs_SetBlend(Sprite, BlendMode)
Procedure gs_SetFiltering(Sprite, FilterMode)
Procedure gs_SetShape(Sprite, Shape)
Procedure gs_GetShape(Sprite)
Procedure gs_GetVertexArray(Sprite, Array vertex.gs_xyzuvc(1))
Procedure gs_SetVertexArray(Sprite, Array vertex.gs_xyzuvc(1))
Procedure gs_GetColumns(Sprite)
Procedure gs_GetRows(Sprite)
                                                                                                                                                                                                                                                                                                                                                     

Posted: Sat Mar 28, 2009 7:07 pm
by eddy
I made a mistake in the first version of my gradient function.
That's why It looks like rainbow.

Image

This is a valid gradient :
  1. sprite+horz gradient
  2. ring+horz gradient
Image

Posted: Fri Apr 03, 2009 8:08 pm
by eddy
updated