tmyke a écrit :Pour les limitations des mesh manuels, en théorie tu peux monter a 2147483648 faces
ou vertex. Mais je t'avoue ne pas avoir essayé la chose jusque la...
Les valeurs sur sont comme pour les mesh chargés, c-à-d 65536 faces/vertices.
65536 oui c'est le maxi que je peux atteindre, après j'ai une erreur.
Pour tester il suffit de modifier l'exemple précédent
;-Constantes
#NbX=30 ; nombre de facettes
#NbZ=30 ; nombre de facettes
Une facette est composée de deux triangles sur une face ,et deux triangles sur l'autre, soit 4 triangles par facettes.
donc si tu mets #Nbx= 127 et #NbZ= 127, ça passe car ça me fait
128*128*4 vertices. Au delà ça plante, je dépasse les 65536.
Pour n'avoir qu'une face 'recto' sans verso, en 3D je ne sais pas comment on peut faire.
Pas grave, je demandais ça pour éviter d'avoir des triangles inutiles, par exemple si je veux faire un simple plan pour faire des sols ou des murs, je n'ai pas forcément besoin de voir l'autre face, ça me ferait une économie de polygones.
en OpenGL il faut faire ça, et je me demandais s'il n'y avait pas un équivalent avec DirectX ?
Code : Tout sélectionner
glEnable(GL_CULL_FACE);indique que certaines faces ne seront pas affichées
glCullFace(GL_BACK);précise ici quelles faces ne pas afficher
Pour ton histoire de copy d'ecran, il existe la fonction que tu emplois déjà, DM_SetBuffer(),
qui ré-oriente la sortie video vers une texture, y compris dans la boucle princpale de rendu.
oui mais c'est pas ce que je veux faire.
Un exemple vaut mieux qu'un grand discours
Voila concrètement ce que je cherche à refaire avec ton moteur.
Je ne vois toujours pas comment je peux copier l'écran dans la texture avec DM_SetBuffer() ? bien avant la boucle principale, et même avant d'ouvrir un écran avec OpenScreen ?
Code : Tout sélectionner
;**********************************************
;** Comtois ** 22/08/05 ** Matrice / Vagues **
;**********************************************
;Modifications and additions by Psychophanta
;/SnapShot
#Img_SnapShot = 0
ExamineDesktops()
hBitmap = CreateImage(#Img_SnapShot, DesktopWidth(0), DesktopHeight(0))
hdc = StartDrawing(ImageOutput(0))
SelectObject_(hdc, hBitmap)
BitBlt_(hdc, 0, 0, DesktopWidth(0), DesktopHeight(0), GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
StopDrawing()
DeleteDC_(hdc)
;-Initialisation
bitplanes.b=32:RX.w=1024:RY.w=768
If InitEngine3D()=0 Or InitSprite()=0 Or InitKeyboard()=0
MessageRequester("Error","Something fails to open Screen for 3D. This requires Engine3D.dll",0)
End
EndIf
While OpenScreen(RX.w,RY.w,bitplanes.b,"DemoMatrice")=0
If bitplanes.b>16:bitplanes.b-8
ElseIf RY.w>600:RX.w=800:RY.w=600
ElseIf RY.w>480:RX.w=640:RY.w=480
ElseIf RY.w>400:RX.w=640:RY.w=400
ElseIf RY.w>240:RX.w=320:RY.w=240
ElseIf RY.w>200:RX.w=320:RY.w=200
Else:MessageRequester("VGA limitation","Can't open Screen!",0):End
EndIf
Wend
Structure Vecteur
x.f
y.f
z.f
EndStructure
Structure Vertex
x.f
y.f
z.f
Nx.f
Ny.f
Nz.f
;Cx.f
;Cy.f
;Cz.f
u.f
v.f
EndStructure
Structure DoubleFace
f1.w
f2.w
f3.w
f4.w
f5.w
f6.w
f7.w
f8.w
f9.w
f10.w
f11.w
f12.w
EndStructure
;-Constantes
#NbX=30 ; nombre de facettes
#NbZ=30 ; nombre de facettes
#DegConv=3.14159265/180
#PB_Mesh_Vertex = 1 << 0
#PB_Mesh_Color = 1 << 1
#PB_Mesh_Normal = 1 << 2
#PB_Mesh_UVCoordinate = 1 << 3
;Additionnnal flag To specify the faces
#PB_Mesh_Face = 1 << 4
;-Variables Globales
Global AngleVague.f,WaveFrequency.f,WavePeriodX.f,WavePeriodZ.f,WaveAmplitude.f
Global xrot.f,yrot.f,zrot.f
Global CamLocateX.l,CamLocateY.l,CamLocateZ.l,CamLookAtX.l,CamLookAtY.l,CamLookAtZ.l
Global Mode.b
circle.l=360
AngleVague=Random(circle)
WaveFrequency=3;=waves/second
WavePeriodX=5;=1/Wave lenght
WavePeriodZ=9;=1/Wave lenght
WaveAmplitude=2
xrot=-0.3:yrot=-0.4:zrot=0.2
CamLocateX.l=0:CamLocateY.l=0:CamLocateZ.l=50
CamLookAtX.l=0:CamLookAtY.l=0:CamLookAtZ.l=0
;-Procédures
Procedure Matrice(*Vertex.Vertex,*Face.DoubleFace,FX.l,FZ.l)
*Ptr.Vertex=*Vertex
FX2=FX/2
FZ2=FZ/2
For b=0 To FZ
For a=0 To FX
*Ptr\x= a-FX2
*Ptr\y=0
*Ptr\z=b-FZ2
*Ptr\u=a/FX
*Ptr\v=b/FZ
*Ptr + SizeOf(Vertex)
Next a
Next b
*PtrF.DoubleFace=*Face
Nb=FX+1
For b=0 To FZ-1
For a=0 To FX-1
P1=a+(b*Nb)
P2=P1+1
P3=a+(b+1)*Nb
P4=P3+1
;Face 1
*PtrF\f1=P3 : *PtrF\f2=P2 : *PtrF\f3=P1
*PtrF\f4=P2 : *PtrF\f5=P3 : *PtrF\f6=P4
;Face 2
*PtrF\f7=P1 : *PtrF\f8=P2 : *PtrF\f9=P3
*PtrF\f10=P4 : *PtrF\f11=P3 : *PtrF\f12=P2
*PtrF + SizeOf(DoubleFace)
Next
Next
EndProcedure
Procedure MakeNormale(*Vertex.Vertex,*Face.DoubleFace,Fx,Fz)
Protected *Ptr.Vertex, *PtrF.DoubleFace, *PtrN.Vecteur, Temp.Vecteur
Protected Vecteur1.Vecteur, Vecteur2.Vecteur, P1.Vecteur, P2.Vecteur, P3.Vecteur ,*N.Vecteur
*N=AllocateMemory((Fx+1)*(Fz+1)*SizeOf(Vecteur))
*PtrF=*Face
For b=0 To FZ-1
For a=0 To FX-1
;{ Calcule la normale du premier triangle
;Avec les 3 vertices qui composent le triangle, on détermine deux vecteurs
*Ptr=*Vertex + *PtrF\f1 * SizeOf(Vertex)
P1\x = *Ptr\x
P1\y = *Ptr\y
P1\z = *Ptr\z
*Ptr=*Vertex + *PtrF\f2 * SizeOf(Vertex)
P2\x = *Ptr\x
P2\y = *Ptr\y
P2\z = *Ptr\z
*Ptr=*Vertex + *PtrF\f3 * SizeOf(Vertex)
P3\x = *Ptr\x
P3\y = *Ptr\y
P3\z = *Ptr\z
Vecteur1\x = (P1\x - P2\x)
Vecteur1\y = (P1\y - P2\y)
Vecteur1\z = (P1\z - P2\z)
Vecteur2\x = (P1\x - P3\x)
Vecteur2\y = (P1\y - P3\y)
Vecteur2\z = (P1\z - P3\z)
;Calcule la normale du premier triangle
Temp\x = ((Vecteur1\y * Vecteur2\z) - (Vecteur1\z * Vecteur2\y))
Temp\y = ((Vecteur1\z * Vecteur2\x) - (Vecteur1\x * Vecteur2\z))
Temp\z = ((Vecteur1\x * Vecteur2\y) - (Vecteur1\y * Vecteur2\x))
;Et affecte cette normale aux vertices composants le premier triangle
*PtrN=*N + *PtrF\f1 * SizeOf(Vecteur)
*PtrN\x + Temp\x
*PtrN\y + Temp\y
*PtrN\z + Temp\z
*PtrN=*N + *PtrF\f2 * SizeOf(Vecteur)
*PtrN\x + Temp\x
*PtrN\y + Temp\y
*PtrN\z + Temp\z
*PtrN=*N + *PtrF\f3 * SizeOf(Vecteur)
*PtrN\x + Temp\x
*PtrN\y + Temp\y
*PtrN\z + Temp\z
;}
;{ Calcule la normale du second triangle
;Avec les 3 vertices qui composent le triangle, on détermine deux vecteurs
*Ptr=*Vertex + *PtrF\f4 * SizeOf(Vertex)
P1\x = *Ptr\x
P1\y = *Ptr\y
P1\z = *Ptr\z
*Ptr=*Vertex + *PtrF\f5 * SizeOf(Vertex)
P2\x = *Ptr\x
P2\y = *Ptr\y
P2\z = *Ptr\z
*Ptr=*Vertex + *PtrF\f6 * SizeOf(Vertex)
P3\x = *Ptr\x
P3\y = *Ptr\y
P3\z = *Ptr\z
Vecteur1\x = (P1\x - P2\x)
Vecteur1\y = (P1\y - P2\y)
Vecteur1\z = (P1\z - P2\z)
Vecteur2\x = (P1\x - P3\x)
Vecteur2\y = (P1\y - P3\y)
Vecteur2\z = (P1\z - P3\z)
;Calcule la normale du second triangle
Temp\x = ((Vecteur1\y * Vecteur2\z) - (Vecteur1\z * Vecteur2\y))
Temp\y = ((Vecteur1\z * Vecteur2\x) - (Vecteur1\x * Vecteur2\z))
Temp\z = ((Vecteur1\x * Vecteur2\y) - (Vecteur1\y * Vecteur2\x))
;Et affecte cette normale aux vertices composants le second triangle
*PtrN=*N + *PtrF\f4 * SizeOf(Vecteur)
*PtrN\x + Temp\x
*PtrN\y + Temp\y
*PtrN\z + Temp\z
*PtrN=*N + *PtrF\f5 * SizeOf(Vecteur)
*PtrN\x + Temp\x
*PtrN\y + Temp\y
*PtrN\z + Temp\z
*PtrN=*N + *PtrF\f6 * SizeOf(Vecteur)
*PtrN\x + Temp\x
*PtrN\y + Temp\y
*PtrN\z + Temp\z
;}
;Face suivante
*PtrF + SizeOf(DoubleFace)
Next a
Next b
;Norme et affecte la normale de chaque Vertex
*PtrN=*N
*Ptr=*Vertex
For b=0 To FZ
For a=0 To FX
Norme=Sqr(*PtrN\x * *PtrN\x + *PtrN\y * *PtrN\y + *PtrN\z * *PtrN\z)
If norme = 0
*Ptr\Nx = 0
*Ptr\Ny = 0
*Ptr\Nz = 0
Else
*Ptr\Nx = *PtrN\x / Norme
*Ptr\Ny = *PtrN\y / Norme
*Ptr\Nz = *PtrN\z / Norme
EndIf
*Ptr + SizeOf(Vertex)
*PtrN + SizeOf(Vecteur)
Next a
Next b
FreeMemory(*N)
EndProcedure
Procedure vagues(*Vertex.Vertex,*Face.DoubleFace)
; Modification sur l'axe des Y
*Ptr.Vertex=*Vertex
For z=0 To #NbZ
For x=0 To #NbX
*Ptr\y=Sin(#DegConv*(AngleVague+x*WavePeriodX+z*WavePeriodZ))*WaveAmplitude
*Ptr + SizeOf(Vertex)
Next
Next
MakeNormale(*Vertex.Vertex,*Face.DoubleFace,#NbX,#NbZ)
SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate,*Vertex,(#NbX+1)*(#NbZ+1))
EndProcedure
Procedure.b ShowTextAndKeyTest(hidetext.b)
If hidetext.b=0
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(RGB(20,180,115))
DrawText(0, 0,"[F1] => Toggle Mode affichage")
DrawText(0, 20,"[PageUp] / [PageDown] => Wave Amplitude : "+StrF(WaveAmplitude))
DrawText(0, 40,"[Up Arrow] / [Down Arrow] => Wave Period on Z axis : "+Str(WavePeriodZ))
DrawText(0, 60,"[Right Arrow] / [Left Arrow] => Wave Period on X axis : "+Str(WavePeriodX))
DrawText(0, 80,"[Home key] / [End key] => Wave speed : "+Str(WaveFrequency))
DrawText(0,100,"[F2] / [Shift+F2] => X rotation speed : "+StrF(xrot))
DrawText(0,120,"[F3] / [Shift+F3] => Y rotation speed : "+StrF(yrot))
DrawText(0,140,"[F4] / [Shift+F4] => Z rotation speed : "+StrF(zrot))
DrawText(0,160,"[F5] / [Shift+F5] => X Camera location : "+Str(CamLocateX))
DrawText(0,180,"[F6] / [Shift+F6] => Y Camera location : "+Str(CamLocateY))
DrawText(0,200,"[F7] / [Shift+F7] => Z Camera location : "+Str(CamLocateZ))
DrawText(0,220,"[F8] / [Shift+F8] => X Camera look at : "+Str(CamLookAtX))
DrawText(0,240,"[F9] / [Shift+F9] => Y Camera look at : "+Str(CamLookAtY))
DrawText(0,260,"[F10] / [Shift+F10] => Z Camera look at : "+Str(CamLookAtZ))
DrawText(0,280,"[F11] => Show or hide text")
DrawText(0,300,"[Space] => Halt")
StopDrawing()
EndIf
If KeyboardReleased(#PB_Key_F1)
If Mode.b:Mode=0:CameraRenderMode(0,#PB_Camera_Textured):Else:Mode=1:CameraRenderMode(0,#PB_Camera_Wireframe):EndIf
EndIf
If KeyboardReleased(#PB_Key_PageUp):WaveAmplitude+0.1:EndIf
If KeyboardReleased(#PB_Key_PageDown):WaveAmplitude-0.1:EndIf
If KeyboardReleased(#PB_Key_Up):WavePeriodZ+1:EndIf
If KeyboardReleased(#PB_Key_Down):WavePeriodZ-1:EndIf
If KeyboardReleased(#PB_Key_Left):WavePeriodX-1:EndIf
If KeyboardReleased(#PB_Key_Right):WavePeriodX+1:EndIf
If KeyboardReleased(#PB_Key_Home):WaveFrequency+1:EndIf
If KeyboardReleased(#PB_Key_End):WaveFrequency-1:EndIf
If KeyboardReleased(#PB_Key_F2)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):xrot-0.1:Else:xrot+0.1:EndIf
EndIf
If KeyboardReleased(#PB_Key_F3)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):yrot-0.1:Else:yrot+0.1:EndIf
EndIf
If KeyboardReleased(#PB_Key_F4)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):zrot-0.1:Else:zrot+0.1:EndIf
EndIf
If KeyboardPushed(#PB_Key_F5)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLocateX-1:Else:CamLocateX+1:EndIf
EndIf
If KeyboardPushed(#PB_Key_F6)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLocateY-1:Else:CamLocateY+1:EndIf
EndIf
If KeyboardPushed(#PB_Key_F7)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLocateZ-1:Else:CamLocateZ+1:EndIf
EndIf
If KeyboardPushed(#PB_Key_F8)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLookAtX-1:Else:CamLookAtX+1:EndIf
EndIf
If KeyboardPushed(#PB_Key_F9)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLookAtY-1:Else:CamLookAtY+1:EndIf
EndIf
If KeyboardPushed(#PB_Key_F10)
If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift):CamLookAtZ-1:Else:CamLookAtZ+1:EndIf
EndIf
If KeyboardReleased(#PB_Key_F11):hidetext.b!1:EndIf
While KeyboardPushed(#PB_Key_Space):ExamineKeyboard():Wend
ProcedureReturn hidetext.b
EndProcedure
;-Mémoires Mesh
*VertexID=AllocateMemory((#NbX+1)*(#NbZ+1)*SizeOf(vertex))
*FaceID=AllocateMemory(#NbX*#NbZ*4*SizeOf(DoubleFace))
Matrice(*VertexID,*FaceID,#NbX,#NbZ)
;-Mesh
CreateMesh(0,1000)
SetMeshData(0,#PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate,*VertexID,(#NbX+1)*(#NbZ+1))
SetMeshData(0,#PB_Mesh_Face,*FaceID,(#NbX)*(#NbZ)*4)
;-Texture
CreateTexture(0, 256, 256)
StartDrawing(TextureOutput(0))
DrawImage(ImageID(#Img_SnapShot),0,0)
StopDrawing()
;- MAterial
CreateMaterial(0, TextureID(0)) ; Material
;MaterialShadingMode(0, #PB_Material_Gouraud) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<BUG ?????
;MaterialShadingMode(0, #PB_Material_Phong) ; Phong = Flat ???
MaterialBlendingMode(0, #PB_Material_AlphaBlend)
MaterialAmbientColor(0, RGB(255,55,55))
MaterialDiffuseColor(0, RGB(255,255,128))
MaterialSpecularColor(0,RGB(255,0,0))
;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
;-Camera
CreateCamera(0,0,0,100,100)
AmbientColor(RGB(95,95,95));<- Essential for clarity
;Light
CreateLight(0,RGB(255,255,128))
LightLocate(0,EntityX(0)/2,EntityY(0)+800,EntityZ(0)/2)
;-Boucle principale
Repeat
ClearScreen(0)
ExamineKeyboard()
CameraLocate(0,CamLocateX,CamLocateY,CamLocateZ)
CameraLookAt(0,CamLookAtX,CamLookAtY,CamLookAtZ)
;Calculate (AngleVague+WaveFrequency)%360: (coz % operand doesn't accept floats)
!fild dword[v_circle]
!fld dword[v_AngleVague]
!fadd dword[v_WaveFrequency]
!fprem
!fstp dword[v_AngleVague]
!fstp st1
vagues(*VertexID,*FaceID)
xrot + 0.1
yrot + 0.1
zrot + 0.1
RotateEntity(0,xrot,yrot,zrot)
RenderWorld()
hidetext.b=ShowTextAndKeyTest(hidetext.b)
FlipBuffers():Delay(7)
Until KeyboardPushed(#PB_Key_Escape)
Maintenant pour avoir une anim 2D faite dans une image que tu modifie en 'live' pour en meme temps l'appliquer sur une texture d'un mesh affiché a l'ecran, faut que je voie le truc...
J'allais y venir tôt ou tard à ce sujet, mais c'est pas ce que je cherchais à faire pour l'instant, mais si tu as le temps de faire une démo ça pourrait être cool
