Page 1 sur 1

Afficher un sprite3D au dessus d'une scene 3D

Publié : mar. 26/sept./2006 14:49
par Progi1984
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

Publié : mar. 26/sept./2006 15:53
par Anonyme
Ton code marche, je vois bien un carré de couleur (128,0,128).


@++

Publié : mar. 26/sept./2006 15:57
par Progi1984
Avec un cube qui tourne derrière ?

Publié : mar. 26/sept./2006 16:59
par Anonyme
bah oui ^^ , je peut même faire jouer la transparence.

Publié : mar. 26/sept./2006 17:39
par comtois
oui moi aussi je vois un carré violet affiché par dessus un cube 3D bleu

Publié : mar. 26/sept./2006 17:51
par djes
Ca fonctionne ici.

Publié : mar. 26/sept./2006 18:27
par Dr. Dri
Chez moi le carré est blanc à cause des dimensions du Sprite3D
En revanche en modifiant les fonctions concernée pas de souci ca fonctionne bien

Code : Tout sélectionner

Procedure Test_Init()
  Test=CreateSprite(#PB_Any,256,256, #PB_Sprite_Texture)
 
  If StartDrawing(SpriteOutput(Test))
    Box(0,0,256,256,RGB(128,0,128))
    StopDrawing()
  EndIf
  Test_3D= CreateSprite3D(#PB_Any,Test)
 
EndProcedure
Procedure Test_Update()
  ;DisplayTransparentSprite(Test, 0, 0)
  Start3D()
    DisplaySprite3D(Test_3D,100,100,192)
  Stop3D()
EndProcedure
Dri

Publié : mar. 26/sept./2006 18:33
par Guimauve
Pour moi aussi, ça fonctionne bien

A+
Guimauve

Publié : mar. 26/sept./2006 21:17
par Frenchy Pilou
Sans le truc du Dr DRI un cube bleu tourne derièrre une surface carrée mauve
Avec le truc du Dr DRI un cube bleu tourne derièrre une surface carrée mauve qui devient transparente au dessus du cube bleu

Publié : mer. 27/sept./2006 7:54
par Progi1984
Faut le faire, je suis le seul à rien voir !

Publié : mer. 27/sept./2006 9:20
par lionel_om
Progi1984 a écrit :Faut le faire, je suis le seul à rien voir !
Non pareil, sur le PC du taff : Win 2003 Serveur