I made this tip for MP3D some time ago and i translated to PB native, but i got surprised because is too slow.
Might be due to the fact that in MP3D the vertex coordinates are written directly in the mesh vertex memory?
Code: Select all
Structure Vector
x.f
y.f
z.f
m.f
EndStructure
Structure PointVertex
x.f
y.f
z.f
color.l;d3dcolor
EndStructure
InitEngine3D()
Add3DArchive(#PB_Compiler_Home+"Examples/3D/Data/Textures",#PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home+"Examples/3d/Data/fonts",#PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home+"Examples/3d/Data/Scripts",#PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home+"examples/3d/Data/Models", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home+"examples/3d/Data/Packs/skybox.zip", #PB_3DArchive_Zip)
Parse3DScripts()
InitSprite()
InitKeyboard()
InitMouse()
ExamineDesktops()
Global bitplanes.b=DesktopDepth(0),RX.w=DesktopWidth(0),RY.w=DesktopHeight(0),refreshrate.a=DesktopFrequency(0)
; Global win.i=OpenWindow(#PB_Any,240,180,RX/3,RY/3,"press up/down to move",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_TitleBar)
; OpenWindowedScreen(WindowID(win),0,0,RX/3,RY/3,1,0,0,#PB_Screen_WaitSynchronization)
OpenScreen(RX,RY,bitplanes,"press up/down to move",#PB_Screen_WaitSynchronization,refreshrate)
Global camera.i=CreateCamera(#PB_Any,0,0,100,100)
MoveCamera(camera,0,0,300,#PB_Absolute)
CameraRange(camera,1,10000)
CameraLookAt(camera,0,0,0)
Global light.i=CreateLight(#PB_Any,RGB(245,245,245),0,100,200,#PB_Light_Point)
LightLookAt(light,0,0,0)
#NVertex=90000:#TransSteps=150:#ObjectStayTime=600
;- Material
Global mat.i=CreateMaterial(#PB_Any,TextureID(LoadTexture(#PB_Any,"White.jpg")))
DisableMaterialLighting(mat.i,1)
; MaterialShininess(mat,0)
; MaterialBlendingMode(mat,#PB_Material_AlphaBlend)
Global objeto.l=1,Stars.i,malla.i=CreateMesh(#PB_Any,#PB_Mesh_PointList,#PB_Mesh_Static),Dim OriginVertex.PointVertex(#NVertex),Dim TargetVertex.Vector(#NVertex),Dim trans.Vector(#NVertex),TransCount.l
Procedure DrawMatrix()
Protected r.w=230,g.w=200,b.w=110,i.i
For i=0 To #NVertex
OriginVertex(i)\color=RGBA(r,g,b,200)
OriginVertex(i)\x=(Random(1800)-900)/10*i/#NVertex
OriginVertex(i)\y=(Random(1800)-900)/10*i/#NVertex
OriginVertex(i)\z=(Random(1800)-900)/10*i/#NVertex
MeshVertexPosition(OriginVertex(i)\x,OriginVertex(i)\y,OriginVertex(i)\z)
MeshVertexColor(OriginVertex(i)\color)
Next
FinishMesh(0)
SetMeshMaterial(malla,MaterialID(mat))
Stars.i=CreateNode(#PB_Any,0,0,0)
AttachNodeObject(Stars,MeshID(malla))
EndProcedure
Macro getmod(ve)
v#\m=Sqr(v#\x*v#\x+v#\y*v#\y+v#\z*v#\z)
EndMacro
Macro GetTransStepVector()
trans(i)\x=(TargetVertex(i)\x-OriginVertex(i)\x)/#TransSteps
trans(i)\y=(TargetVertex(i)\y-OriginVertex(i)\y)/#TransSteps
trans(i)\z=(TargetVertex(i)\z-OriginVertex(i)\z)/#TransSteps
EndMacro
Procedure object(obj.l)
;ver más en http://www.mathcurve.com/surfaces/superficies.shtml
Protected i.l,xd.f,u.f,ii.f=360/#NVertex
Select obj
Case 2
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(u)*100
TargetVertex(i)\y=Cos(xd)*Sin(u)*100
TargetVertex(i)\z=Sin(xd)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
; ;cinta de moebius
; For i=0 To #NVertex
; xd=Random(1800)
; u=i*ii
; TargetVertex(i)\x=Cos(xd)*(10+u*Cos(xd/2))
; TargetVertex(i)\y=Sin(xd)*(10+u*Cos(xd/2))
; TargetVertex(i)\z=u*Sin(xd/2)
; ;Get "trans" Step-vector:
; GetTransStepVector()
; Next
Case 3
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(u)*100
TargetVertex(i)\y=Cos(xd)*Sin(u)*100
TargetVertex(i)\z=Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 4
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Sin(i*360/#NVertex)*Cos(u)*100
TargetVertex(i)\y=Cos(xd)*Cos(u)*100
TargetVertex(i)\z=Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 5
For i=0 To #NVertex
xd=Random(1800)
TargetVertex(i)\x=Cos(xd)*Cos(xd)*100
TargetVertex(i)\y=Cos(xd)*Sin(xd)*100
TargetVertex(i)\z=Sin(i*ii)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 6
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(xd)*100
TargetVertex(i)\y=Cos(u)*Sin(xd)*100
TargetVertex(i)\z=Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 7
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(u)*Cos(u)*100
TargetVertex(i)\y=Cos(u)*Sin(xd)*100
TargetVertex(i)\z=Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 8
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(u)*100
TargetVertex(i)\y=Cos(xd)*Sin(u)*100
TargetVertex(i)\z=Sin(xd)*Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 9
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Sin(u)*Cos(u)*Sin(xd)*100
TargetVertex(i)\y=Cos(u)*Sin(xd)*Cos(xd)*100
TargetVertex(i)\z=Sin(xd)*Cos(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 10
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(u)*100
TargetVertex(i)\y=Cos(u)*Sin(xd)*100
TargetVertex(i)\z=Cos(xd)*Sin(xd)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 11
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(u)*100
TargetVertex(i)\y=Sin(xd)*Sin(u)*100
TargetVertex(i)\z=Sin(xd)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 12
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(u)*Cos(xd)*100
TargetVertex(i)\y=Sin(u)*Sin(xd)*100
TargetVertex(i)\z=Sin(u)*Sin(xd)*Cos(u)*Cos(xd)*200
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 13
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(xd)*100
TargetVertex(i)\y=Sin(u)*Sin(xd)*100
TargetVertex(i)\z=Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 14
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Sin(xd)*Cos(xd)*100
TargetVertex(i)\y=Sin(xd)*Sin(u)*100
TargetVertex(i)\z=Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 15
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(u)*100
TargetVertex(i)\y=Cos(u)*Sin(u)*100
TargetVertex(i)\z=Sin(xd)*Cos(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 16
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(u)*Sin(u)*100
TargetVertex(i)\y=Sin(u)*Sin(xd)*Cos(u)*100
TargetVertex(i)\z=Sin(xd)*Cos(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 17
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Cos(xd)*100
TargetVertex(i)\y=Cos(u)*Sin(u)*100
TargetVertex(i)\z=Sin(u)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 18
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Cos(xd)*Sin(u)*100
TargetVertex(i)\y=Cos(xd)*Cos(u)*100
TargetVertex(i)\z=Cos(xd)*100
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 19
For i=0 To #NVertex
xd=Random(1800)
u=i*ii
TargetVertex(i)\x=Sin(xd)*Cos(xd)*Sin(u)*200
TargetVertex(i)\y=Sin(u)*Cos(u)*Sin(xd)*200
TargetVertex(i)\z=Sin(u)*Cos(xd)*Cos(u)*200
;Get "trans" step-vector:
GetTransStepVector()
Next
Case 20
For i=0 To #NVertex
TargetVertex(i)\x=Random(150)-75
TargetVertex(i)\y=Random(150)-75
TargetVertex(i)\z=Random(150)-75
If Random(1)
PokeF(TargetVertex(i)+SizeOf(float)*(Random(2)),75)
Else
PokeF(TargetVertex(i)+SizeOf(float)*(Random(2)),-75)
EndIf
;Get "trans" step-vector:
GetTransStepVector()
Next
Default
For i=0 To #NVertex
TargetVertex(i)\x=(Random(1800)-900)/10*i/#NVertex
TargetVertex(i)\y=(Random(1800)-900)/10*i/#NVertex
TargetVertex(i)\z=(Random(1800)-900)/10*i/#NVertex
;Get "trans" step-vector:
GetTransStepVector()
Next
EndSelect
Transcount=#TransSteps
EndProcedure
;==============================================================
DrawMatrix()
; enti.i=CreateEntity(#PB_Any,MeshID(malla),MaterialID(mat))
zz.f=0
; UseCursor(0)
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up)
zz.f+20
ElseIf KeyboardPushed(#PB_Key_Down)
zz.f-20
EndIf
contador.l+1
If contador>=#ObjectStayTime
contador=0
objeto+1:If objeto>20:objeto=1:EndIf
object(objeto.l)
EndIf
If TransCount>0
TransCount-1
If TransCount>0
UpdateMesh(malla,0)
For i.i=0 To #NVertex
OriginVertex(i)\x+trans(i)\x
OriginVertex(i)\y+trans(i)\y
OriginVertex(i)\z+trans(i)\z
MeshVertexPosition(OriginVertex(i)\x,OriginVertex(i)\y,OriginVertex(i)\z)
Next
FinishMesh(0)
Else
UpdateMesh(malla,0)
For i.i=0 To #NVertex
OriginVertex(i)\x=TargetVertex(i)\x
OriginVertex(i)\y=TargetVertex(i)\y
OriginVertex(i)\z=TargetVertex(i)\z
MeshVertexPosition(OriginVertex(i)\x,OriginVertex(i)\y,OriginVertex(i)\z)
Next
FinishMesh(0)
EndIf
EndIf
MoveNode(Stars,0,0,zz,#PB_Absolute)
RotateNode(Stars,1.333,0.5,0.2,#PB_Relative)
RenderWorld()
FlipBuffers():Delay(10)
Until KeyboardPushed(#PB_Key_Escape); Or WindowEvent()=#PB_Event_CloseWindow