Afficher un sprite3D au dessus d'une scene 3D
Publié : mar. 26/sept./2006 14:49
Voilà, j'essaie d'afficher un sprite 3D au dessus d'une scene 3D mais impossible alors que je n'ai aucun probleme avec un sprite tout court !
Code : Tout sélectionner
; Comtois 01/05/06
; Progi1984 After
;{ Macros
Macro MyRGB(Rouge,Vert,Bleu)
Rouge << 16 + Vert << 8 + Bleu
EndMacro
;}
;{ Structures
Structure Vertex
px.f
py.f
pz.f
nx.f
ny.f
nz.f
co.l
u.f
v.f
EndStructure
Structure FTriangle
f1.w
f2.w
f3.w
EndStructure
Structure s_Mesh
No.l
*VBuffer.Vertex
*Ibuffer.FTriangle
EndStructure
;}
;{ Decls Variables
Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer
Define.s_Mesh CubeMesh
;}
Structure QTest
state.l
texture.l
entity.l
size.l
bgcolor_red.l
bgcolor_green.l
bgcolor_blue.l
fgcolor_red.l
fgcolor_green.l
fgcolor_blue.l
font.s
font_name.s
font_size.l
alpha.f
delimiter.s
trigger.l
Version.s
EndStructure
Structure QTest_Line
QLine.s
QType.l
EndStructure
Global NewList TTest.QTest()
Global NewList TTest_Line.QTest_Line()
Global Test
Global Test_3D
Declare CreateColorMeshCube(*Mesh.s_Mesh, Color.l)
Declare Test_Init()
Declare Test_Update()
; Initialisation
If InitEngine3D() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
End
EndIf
OpenWindow(0,0, 0, 800 , 600 ,"Cube 3D",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
;{ 3D
; Mesh
CubeMesh\No = 0
CreateColorMeshCube(@CubeMesh, MyRGB(0,128,128))
; Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
Box(0, 0, 128, 128, $FFFFFF)
Box(1, 1, 126, 126, $880000)
StopDrawing()
; Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1)
; Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,90,90,90)
; Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-400)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))
; Light
AmbientColor(RGB(255,255,255))
;}
Test_Init()
Repeat
ClearScreen(RGB(0,0,64))
While WindowEvent() : Wend
Angle + 0.8
RotateEntity(0,angle,angle/2,-Angle)
If ExamineKeyboard()
EndIf
;DisplayTransparentSprite(0, 0, 30)
RenderWorld()
Test_Update()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Procedure Test_Init()
Test=CreateSprite(#PB_Any,300,300, #PB_Sprite_Texture)
If StartDrawing(SpriteOutput(Test))
Box(0,0,300,300,RGB(128,0,128))
StopDrawing()
EndIf
Test_3D= CreateSprite3D(#PB_Any,Test)
EndProcedure
Procedure Test_Update()
;DisplayTransparentSprite(Test, 0, 0)
Start3D()
DisplaySprite3D(Test_3D,0,0,255)
Stop3D()
EndProcedure
Procedure CreateColorMeshCube(*Mesh.s_Mesh, Color.l)
*Mesh\VBuffer=AllocateMemory(SizeOf(Vertex)*24)
*Mesh\IBuffer=AllocateMemory(SizeOf(FTriangle)*12)
CopyMemory(?Vertices , *Mesh\VBuffer, SizeOf(Vertex)*24)
CopyMemory(?Triangles, *Mesh\IBuffer, SizeOf(Vertex)*24)
If CreateMesh(*Mesh\No,100)
Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
SetMeshData(*Mesh\No, Flag , *Mesh\VBuffer, 24)
SetMeshData(*Mesh\No, #PB_Mesh_Face, *Mesh\IBuffer, 12)
; ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
*Mem.Vertex = *Mesh\VBuffer
For i = 0 To 23
*Mem\co=Color
*Mem + SizeOf(Vertex)
Next i
Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
SetMeshData(*Mesh\No, Flag , *Mesh\VBuffer, 24)
ProcedureReturn 1
EndProcedure
DataSection
;{
Vertices:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5, 0,1,0, 0, 0,0
Data.f 0.5,0.5,-0.5,0,1,0,0,0,1
Data.f 0.5,0.5,0.5,0,1,0,0,1,1
Data.f -0.5,0.5,0.5, 0,1,0, 0, 1,0
;Dessous 4 à 7
Data.f -0.5,-0.5,0.5,0,-1,0,0,0,0
Data.f 0.5,-0.5,0.5,0,-1,0,0,0,1
Data.f 0.5,-0.5,-0.5,0,-1,0,0,1,1
Data.f -0.5,-0.5,-0.5,0,-1,0,0,1,0
;Devant 8 à 11
Data.f -0.5,0.5,0.5,0,0,1,0,0,0
Data.f 0.5,0.5,0.5,0,0,1,0,0,1
Data.f 0.5,-0.5,0.5,0,0,1,0,1,1
Data.f -0.5,-0.5,0.5,0,0,1,0,1,0
;Derrière 12 à 15
Data.f 0.5,0.5,-0.5,0,0,-1,0,0,0
Data.f -0.5,0.5,-0.5,0,0,-1,0,0,1
Data.f -0.5,-0.5,-0.5,0,0,-1,0,1,1
Data.f 0.5,-0.5,-0.5,0,0,-1,0,1,0
;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5,-1,0,0,0, 0,0
Data.f -0.5,0.5,0.5, -1,0,0, 0, 0,1
Data.f -0.5,-0.5,0.5, -1,0,0, 0, 1,1
Data.f -0.5,-0.5,-0.5, -1,0,0, 0, 1,0
;Cote droit 20 à 23
Data.f 0.5,0.5,0.5, 1,0,0, 0, 0,0
Data.f 0.5,0.5,-0.5, 1,0,0, 0, 0,1
Data.f 0.5,-0.5,-0.5, 1,0,0, 0, 1,1
Data.f 0.5,-0.5,0.5, 1,0,0, 0, 1,0
Triangles:
;0 à 3
Data.w 2,1,0
Data.w 0,3,2
;4 à 7
Data.w 6,5,4
Data.w 4,7,6
;8 à 11
Data.w 10,9,8
Data.w 8,11,10
;12 à 15
Data.w 14,13,12
Data.w 12,15,14
;16 à 19
Data.w 18,17,16
Data.w 16,19,18
;20 à 23
Data.w 22,21,20
Data.w 20,23,22
;}
EndDataSection