après plusieurs plantages, j'ai réussi à transformer mon code pour qu'il tourne, enfin presque, ça ne fonctionne toujours pas le détache entity.
Code : Tout sélectionner
;Comtois le 11/11/06
;Rubik 
;Fichiers Include
IncludePath "..\Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"    
Enumeration 
  #Haut
  #Bas
  #Devant
  #Derriere
  #Gauche
  #Droit
  #CentreX
  #CentreY
  #CentreZ
EndEnumeration
Declare CreateCube(x, y, z)
Declare DetacheRotation()
Declare ParentRotation(No)
Declare Rotation(No, S)
Declare MiseAJour(Type, S)
Global *camera.CEntity
Global *font.CFont
Global *brush.CBrush
Global *texture.CTexture
Global *Cube
Global Taille
Define Angle
Global Dim *Pivot(8)
Global Dim *Rubik(2, 2, 2)
Global Dim *TempRubik(2, 2, 2)
;-Initialisation 
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  End
EndIf
;-ouvre un ecran 3D
DM_Graphics3D(800, 600, 32,  1, 1)
;-font
*font = DM_LoadFont("Arial", 8, 1)
DM_SetColorText(*font, 255, 255, 0,255)
;-Texture
*texture = DM_CreateTexture(256,256)
;ré-oriente le buffer de sortie graphique vers notre texture
DM_SetBuffer(*texture)
DM_BeginScene()
  DM_ClsScreen (  0, 0,   0, 255)      ; efface le buffer avec une couleur
  DM_SetColor2D(255, 0,   0, 255)      ; change couleur du trait
  DM_DrawRect  (  1, 1, 254, 254)      ; dessin d'un rectangle 2D
DM_EndScene()
;de nouveau le buffer vers l'ecran
DM_SetBuffer(#Null)
;-Brush
*brush = DM_CreateBrush(Str(*entity))
DM_BrushAmbient(*brush, 255,128,0,255)
DM_BrushDiffuse(*brush, 255,128,0,255)
DM_BrushTexture(*brush, *texture, 0)
; modifie l'état de rendu de la Brush pour voir de tous les cotés
DM_BrushAddRender(*brush, #D3DRS_CULLMODE, #D3DCULL_NONE)
;-Creation rubik cube
Taille = 50
For z = 0 To 2
  For y = 0 To 2
    For x = 0 To 2
      No = CreateCube(x, y, z)
      DM_ScaleEntity(No, Taille - 2, Taille - 2, Taille - 2)
      DM_PositionEntity(No, (x-1) * Taille , (y-1) * Taille , (z-1) * Taille)
      *Rubik(x,y,z) = No
    Next x
  Next y
Next z
;-Pivots
For i = 0 To 8
  *Pivot(i) = DM_CreatePivot()
Next i
Angle = 90
  
;-Light
;DM_AmbiantLight(180, 180, 180)
;-camera
*camera = DM_CreateCamera(#Null)
DM_CameraClsColor(*camera, 0, 0, 15)
DM_PositionEntity(*camera, DM_EntityX(*Rubik(1,1,1)) + 250,DM_EntityY(*Rubik(1,1,1)) + 250, DM_EntityZ(*Rubik(1,1,1)) - 250)
DM_PointEntity(*camera, *Rubik(1,1,1))
;-Boucle principale
Repeat
  ExamineKeyboard()
    
  If KeyboardReleased(#PB_Key_F1)
    Pause = 1 - Pause
  EndIf
  ExamineMouse()
;   If MouseButton(#PB_MouseButton_Left)
;     *Cube = DM_CameraPick(*camera, MouseX(), MouseY())
;     ;Recherche le cube 
;     For x = 0 To 2
;       For y = 0 To 2
;         For z = 0 To 2
;           If *Rubik(x, y, z) = *Cube
;             px = x : py = y : pz = z 
;             Break 3
;           EndIf
;         Next z
;       Next y
;     Next x  
;     ;Calcul le type de rotation en fonction de la position du cube
;     If MouseDeltaX()<>0 Or MouseDeltaY()<>0
;       Dx.f = MouseDeltaX()
;       Dy.F = MouseDeltaY()
;     EndIf
;           
;   EndIf
  If Angle < 90
    If pause = 0
    Rotation(Type, Sens)
    Angle + 1
    EndIf
    If Angle = 90
      MiseAjour(Type, Sens)       
    EndIf  
  EndIf
  If Angle = 90
    DetacheRotation()
    Angle = 0
    Type = Random(8)
    ;Type = #CentreZ 
    Repeat
      Sens = 1-Random(2)
    Until Sens <> 0
    ParentRotation(Type)
  EndIf
    
  DM_BeginScene()
    DM_Renderworld()
    DM_DrawText(*font,0,0,StrF(DX,2) + " : " + StrF(dy,2))
    DM_SetColor2D(255, 255, 255, 255)
    DM_DrawOval(MouseX(), MouseY(), 8, 8)
  DM_EndScene()
Until KeyboardPushed(#PB_Key_Escape)
DM_ClearGraphics()
End
Procedure MiseAjour(Type, Sens)
  Define *Temp
  If Type = #Haut Or Type = #Droit Or Type = #Derriere
    h = 2
  ElseIf Type = #CentreX Or Type = #CentreY Or Type = #CentreZ
    h = 1
  ElseIf Type = #Bas Or Type = #Gauche Or type = #Devant
    h = 0
  EndIf  
  
  CopyMemory(*Rubik(), *TempRubik(), SizeOf(Long) * 27)
  If Type = #Haut Or Type = #Bas Or Type = #CentreY 
    If Sens
      
      *Rubik(0, h, 2) = *TempRubik(2, h, 2)  
      *Rubik(1, h, 2) = *TempRubik(2, h, 1)
      *Rubik(2, h, 2) = *TempRubik(2, h, 0)
      
      *Rubik(0, h, 1) = *TempRubik(1, h, 2)  
      *Rubik(1, h, 1) = *TempRubik(1, h, 1)
      *Rubik(2, h, 1) = *TempRubik(1, h, 0)  
      
      *Rubik(0, h, 0) = *TempRubik(0, h, 2)
      *Rubik(1, h, 0) = *TempRubik(0, h, 1)
      *Rubik(2, h, 0) = *TempRubik(0, h, 0)
    Else
      
      *Rubik(0, h, 0) = *TempRubik(0, h, 2)  
      *Rubik(0, h, 1) = *TempRubik(1, h, 2)
      *Rubik(0, h, 2) = *TempRubik(2, h, 2)
      
      *Rubik(1, h, 0) = *TempRubik(0, h, 1)  
      *Rubik(1, h, 1) = *TempRubik(1, h, 1)
      *Rubik(1, h, 2) = *TempRubik(2, h, 1)  
      
      *Rubik(2, h, 0) = *TempRubik(0, h, 0)
      *Rubik(2, h, 1) = *TempRubik(1, h, 0)
      *Rubik(2, h, 2) = *TempRubik(2, h, 0)
    EndIf
  
  ElseIf Type = #Gauche Or Type = #Droit Or Type = #CentreX    
    If Sens
      
      *Rubik(h, 0, 0) = *TempRubik(h, 0, 2)  
      *Rubik(h, 0, 1) = *TempRubik(h, 1, 2)
      *Rubik(h, 0, 2) = *TempRubik(h, 2, 2)
      
      *Rubik(h, 1, 0) = *TempRubik(h, 0, 1)  
      *Rubik(h, 1, 1) = *TempRubik(h, 1, 1)
      *Rubik(h, 1, 2) = *TempRubik(h, 2, 1)  
      
      *Rubik(h, 2, 0) = *TempRubik(h, 0, 0)
      *Rubik(h, 2, 1) = *TempRubik(h, 1, 0)
      *Rubik(h, 2, 2) = *TempRubik(h, 2, 0)
    Else
      
      *Rubik(h, 0, 2) = *TempRubik(h, 2, 2)  
      *Rubik(h, 1, 2) = *TempRubik(h, 2, 1)
      *Rubik(h, 2, 2) = *TempRubik(h, 2, 0)
      
      *Rubik(h, 0, 1) = *TempRubik(h, 1, 2)  
      *Rubik(h, 1, 1) = *TempRubik(h, 1, 1)
      *Rubik(h, 2, 1) = *TempRubik(h, 1, 0)  
      
      *Rubik(h, 0, 0) = *TempRubik(h, 0, 2)
      *Rubik(h, 1, 0) = *TempRubik(h, 0, 1)
      *Rubik(h, 2, 0) = *TempRubik(h, 0, 0)
    EndIf  
  
  Else  
    If Sens
    
      *Rubik(0, 0, h) = *TempRubik(0, 2, h)  
      *Rubik(0, 1, h) = *TempRubik(1, 2, h)
      *Rubik(0, 2, h) = *TempRubik(2, 2, h)
      
      *Rubik(1, 0, h) = *TempRubik(0, 1, h)  
      *Rubik(1, 1, h) = *TempRubik(1, 1, h)
      *Rubik(1, 2, h) = *TempRubik(2, 1, h)  
      
      *Rubik(2, 0, h) = *TempRubik(0, 0, h)
      *Rubik(2, 1, h) = *TempRubik(1, 0, h)
      *Rubik(2, 2, h) = *TempRubik(2, 0, h) 
      
    Else
    
      *Rubik(0, 2, h) = *TempRubik(2, 2, h)  
      *Rubik(1, 2, h) = *TempRubik(2, 1, h)
      *Rubik(2, 2, h) = *TempRubik(2, 0, h)
      
      *Rubik(0, 1, h) = *TempRubik(1, 2, h)  
      *Rubik(1, 1, h) = *TempRubik(1, 1, h)
      *Rubik(2, 1, h) = *TempRubik(1, 0, h)  
      
      *Rubik(0, 0, h) = *TempRubik(0, 2, h)
      *Rubik(1, 0, h) = *TempRubik(0, 1, h)
      *Rubik(2, 0, h) = *TempRubik(0, 0, h)       
    EndIf
    
  EndIf
  
EndProcedure
Procedure DetacheRotation()
  For x = 0 To 2
    For y = 0 To 2 
      For z = 0 To 2
        If DM_GetParent(*Rubik(x, y, z))
          ;DM_DetachEntity(*Rubik(x, y, z))
          DM_EntityParent(*Rubik(x, y, z))
        EndIf  
      Next z
    Next y  
  Next x 
EndProcedure
Procedure ParentRotation(No)
  Select No
    Case #Haut 
      For x = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(x, 2, z), *Pivot(#Haut))
        Next z
      Next x      
    Case #Bas
      For x = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(x, 0, z), *Pivot(#Bas))
        Next z
      Next x  
    Case #Devant
      For x = 0 To 2
        For y = 0 To 2
          DM_EntityParent(*Rubik(x, y, 0), *Pivot(#Devant))
        Next y
      Next x  
    Case #Derriere
      For x = 0 To 2
        For y = 0 To 2
          DM_EntityParent(*Rubik(x, y, 2), *Pivot(#Derriere))
        Next y
      Next x  
    Case #Gauche
      For y = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(0, y, z), *Pivot(#Gauche))
        Next z
      Next y  
    Case #Droit
      For y = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(2, y, z), *Pivot(#Droit))
        Next z
      Next y   
    Case #CentreX
      For y = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(1, y, z), *Pivot(#CentreX))
        Next z
      Next y 
    Case #CentreY 
      For x = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(x, 1, z), *Pivot(#CentreY))
        Next z
      Next x  
    Case #CentreZ 
      For x = 0 To 2
        For y = 0 To 2
          DM_EntityParent(*Rubik(x, y, 1), *Pivot(#CentreZ))
        Next y
      Next x               
  EndSelect
EndProcedure
Procedure Rotation(No, S)
  Select No
    Case #Haut 
      DM_TurnEntity(*pivot(#Haut)    , 0, S, 0)
    Case #Bas
      DM_TurnEntity(*pivot(#Bas)     , 0, S, 0)
    Case #Devant
      DM_TurnEntity(*pivot(#Devant)  , 0, 0, S)
    Case #Derriere
      DM_TurnEntity(*pivot(#Derriere), 0, 0, S)
    Case #Gauche
      DM_TurnEntity(*pivot(#Gauche)  , S, 0, 0)
    Case #Droit
      DM_TurnEntity(*pivot(#Droit)   , S, 0, 0)
    Case #CentreX
      DM_TurnEntity(*pivot(#CentreX) , S, 0, 0)
    Case #CentreY 
      DM_TurnEntity(*pivot(#CentreY) , 0, S, 0)
    Case #CentreZ 
      DM_TurnEntity(*pivot(#CentreZ) , 0, 0, S)    
  EndSelect
EndProcedure
Procedure CreateCube(xx, yy, zz)
  Define.CEntity *entity
  
  *entity = DM_CreateMesh()
  *surface = DM_CreateSurface(*entity)
  Restore Vertex
  For i= 0 To 23
    Read x.f : Read y.f : Read z.f
    Read u.f : Read v.f
    ;Read Rouge : Read Vert : Read bleu
    rouge = 70 : Vert = 60 : Bleu = 80
    ;Couleur dessus
    If yy = 2 And i >=0 And i <=3
      Rouge = 0 : Vert = 0 : bleu = 255
    EndIf
    ;Couleur dessous
    If yy = 0 And i >=4 And i <=7
      Rouge = 255 : Vert = 255 : bleu = 255
    EndIf
    ;Couleur derriere
    If zz = 2 And i >=8 And i <=11
      Rouge = 255 : Vert = 255 : bleu = 0
    EndIf
    ;Couleur devant
    If zz = 0 And i >=12 And i <=15
      Rouge = 255 : Vert = 128 : bleu = 0
    EndIf
    ;Couleur gauche
    If xx = 0 And i >=16 And i <=19
      Rouge = 0 : Vert = 255 : bleu = 0
    EndIf      
    ;Couleur droit
    If xx = 2 And i >=20 And i <=23
      Rouge = 255 : Vert = 0 : bleu = 0
    EndIf  
    ;les coordonnées de vertex
    DM_AddVertex(*surface, x, y, z, u, v)
    ;Couleurs 
    DM_VertexColor(*surface, i, 255,rouge, vert, bleu)    
  Next i
  ;les triangles
  Restore Indice
  For i = 0 To 11
    Read v1.l : Read v2.l : Read v3.l
    DM_AddTriangle(*surface, v1, v2, v3)
  Next i
  ; affecte la brush créee a notre entity
  ;DM_PaintEntity(*entity, *brush, 0)
  ; génératon auto des normales de l'entity créée
  DM_UpdateNormal(*entity)
  ProcedureReturn *entity
EndProcedure
DataSection
Vertex:
; liste des 24 vertex avec leurs coordonnées de textures
;Haut
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f  0.5, 0.5, 0.5, 0, 1
Data.f -0.5, 0.5,-0.5, 1, 0
Data.f  0.5, 0.5,-0.5, 1, 1
;Bas
Data.f -0.5,-0.5, 0.5, 0, 0
Data.f -0.5,-0.5,-0.5, 0, 1
Data.f  0.5,-0.5, 0.5, 1, 0
Data.f  0.5,-0.5,-0.5, 1, 1
;Derrière
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f -0.5,-0.5, 0.5, 0, 1
Data.f  0.5, 0.5, 0.5, 1, 0
Data.f  0.5,-0.5, 0.5, 1, 1
;Devant
Data.f -0.5, 0.5,-0.5, 0, 0
Data.f  0.5, 0.5,-0.5, 0, 1
Data.f -0.5,-0.5,-0.5, 1, 0
Data.f  0.5,-0.5,-0.5, 1, 1
;Gauche
Data.f -0.5, 0.5,-0.5, 0, 0
Data.f -0.5,-0.5,-0.5, 0, 1
Data.f -0.5, 0.5, 0.5, 1, 0
Data.f -0.5,-0.5, 0.5, 1, 1
;Droit
Data.f  0.5, 0.5,-0.5, 0, 0
Data.f  0.5, 0.5, 0.5, 0, 1
Data.f  0.5,-0.5,-0.5, 1, 0
Data.f  0.5,-0.5, 0.5, 1, 1
Indice:
;liste des faces
Data.l  0,  1,  2
Data.l  1,  3,  2
Data.l  4,  5,  6
Data.l  5,  7,  6
Data.l  8,  9, 10
Data.l  9, 11, 10
Data.l 12, 13, 14
Data.l 13, 15, 14
Data.l 16, 17, 18
Data.l 17, 19, 18
Data.l 20, 21, 22
Data.l 21, 23, 22
EndDataSection