Page 1 sur 2

Fonctions pour Dreamotion3D

Publié : mar. 07/nov./2006 22:34
par Anonyme
Voilà au lieu de continuer à bourrer le post de Tmyke, j'ai décider d'ouvrir se post afin de réunir des fonctions utiles pour Dreamotion3D

je commence donc :
*Entity = DM_CreatePlain(sizex.f,sizey.f)

Cette fonction sert à créer une face à 2 triangles (plain) sur l'axe XY
DM_TexturePlain(*entity.CEntity,Texture.s,BackFace.b=#Null)

Cette fonction sert à texturer un plain avec une texture, avec la posibilité de rendre ce plain visible des 2 cotés.

Code : Tout sélectionner

Procedure DM_CreatePlain(sizex.f,sizey.f)
Protected *Temp.l,*bb.CBrush,*texture.CTexture
*Temp = DM_CreateMesh.l(2,4,1,#Null)
DM_VertexCoords(*Temp,0,-sizex/2,-sizey/2,0)
DM_VertexCoords(*Temp,1,sizex/2,-sizey/2,0)
DM_VertexCoords(*Temp,2,sizex/2,sizey/2,0)
DM_VertexCoords(*Temp,3,-sizex/2,sizey/2,0)


DM_VertexTexCoords(*Temp, 0, 0, 0, 0)
DM_VertexTexCoords(*Temp, 1, 0, 1, 0)
DM_VertexTexCoords(*Temp, 2, 0, 1, 1)
DM_VertexTexCoords(*Temp, 3, 0, 0, 1)


DM_VertexTriangle(*Temp,0, 0,1,3,0)
DM_VertexTriangle(*Temp,1, 1,2,3,0)
DM_UpdateNormal(*Temp)
ProcedureReturn *Temp
EndProcedure

Procedure DM_TexturePlain(*entity.CEntity,Texture.s,BackFace.b=#Null)
*bb.CBrush
*texture.CTexture

*bb = DM_CreateBrush("face")
DM_BrushAmbient(*bb, 255,128,0,255)
DM_BrushDiffuse(*bb, 255,128,0,255) 
*texture = DM_GetTexture(*bb, 0)
DM_LoadTexture(*texture ,Texture)
DM_BrushTexture(*bb, *texture,0)
If BackFace<>#Null : DM_BrushAddRender(*bb, #D3DRS_CULLMODE, #D3DCULL_NONE) : EndIf
DM_PaintEntity(*entity, *bb, 0)

EndProcedure
Je me suis inspirer d'un code de Comtois.

@Comtois, je ne sais pas si c'est voulu de ta part, mais dans ton code pour creer un cube manuellement, tu as trop de vertices (24) alors que tu n'as besoin que de 8 vertices, les triangles peuvent partagés les memes vertices.

Re: Fonctions pour Dreamotion3D

Publié : mar. 07/nov./2006 22:39
par comtois
Cpl.Bator a écrit :@Comtois, je ne sais pas si c'est voulu de ta part, mais dans ton code pour creer un cube manuellement, tu as trop de vertices (24) alors que tu n'as besoin que de 8 vertices, les triangles peuvent partagés les memes vertices.
C'est fait exprès pour pouvoir donner une couleur par face ou une texture par face.Du moins avec ogre sous PB.
Maintenant avec Dreamotion3D, je ne sais pas encore si c'est nécessaire ou pas .
Je n'ai pas encore tout vu, je voulais étudier la possibilité de jongler avec plusieurs textures par face.

Publié : mer. 08/nov./2006 6:28
par tmyke
Super Idée ce post. Les fonctions plébiscitée seront intégrés directement dans
DM3D ... :D

Publié : mer. 08/nov./2006 13:00
par Backup
plusieurs suggestions :D

ne pourrai tu pas créer une fonction style "init_engine" qui permette
d'éviter d'avoir a insérer systématiquement les lignes :

Code : Tout sélectionner

; Fichiers Include 
IncludePath "Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"
bref pour chaque langage supporté par ton moteur
il suffirai d'indiquer un "init_engine" qui se chargerai de charger les bon includes , ceux-ci pourrai etre dans le moteur au lieu d'être externes non ?


et aussi songe tu proposer pour les noob dans mon genre
des formes de bases en 3d
avec des fonctions du genre

Cube() <-- longueur, hauteur,couleur,coin arrondi ou pas ect ...
Sphere()
piramide()
tore()
cylindre()
demisphere()
piramide_tronqué()
cone()
cone_tronqué()
barre() <--- longueur, diametre,couleur,ect ...
coude() <-- pouvant preciser l'angle

bref tout un tas de Forme predefini, mais paramétrable
qui je pense aiderai bien pour faire des jeux avec ce moteur :D
j'ai conscience que cela doit etre du travaille .... :?
mais l'idée de disposer de plein de formes (objets), agrémenterai sérieusement ton moulin :D

Publié : mer. 08/nov./2006 14:38
par Anonyme
tu peut déjà faire pas mal de forme dobro, regarde les commandes dispos dans Dreamotion3D.pbi.
Pour ceux qui connaisent , math89 avait fait un fps avec que des plains :D

Publié : mer. 08/nov./2006 14:46
par Backup
ha bah oui effectivement tu parle de

Code : Tout sélectionner

DM_CreateLight.l(type_light.l,  *parent.CEntity=#Null)
    DM_CreateText3D.l(type_font.s, texte.s, Size.l, *parent.CEntity=#Null)
    DM_CreateTeapot.l(*parent.CEntity=#Null)
    DM_CreateCylinder.l(Segment.l=8, *parent.CEntity=#Null)
    DM_CreateCone.l(Segment.l=8, *parent.CEntity=#Null)
    DM_CreateCube.l(*parent.CEntity)
    DM_CreateSphere.l(Segment.l=16, *parent=#Null)
    DM_CreateTorus.l(InnerRadius.f, OuterRadius.f, Sides.l, Rings.l, *parent.CEntity=#Null)
    DM_CreatePolygon.l(length.l, Sides.l, *parent.CEntity=#Null)
    DM_CreateMesh.l(numFaces.l=0, numVertices.l=0, numSurfaces.l=0, *parent.CEntity=#Null)
    DM_RotateMesh(*entity.CEntity, rotationx.f, rotationy.f, rotationz.f)
    DM_TranslateMesh(*entity.CEntity, translatex.f, translatey.f, translatez.f)
    DM_ScaleMesh(*entity.CEntity, scalex.f, scaley.f, scalez.f)
je ne savais meme pas leur existance , vraiment, vivement une Doc :D

mais quand meme des "mega objets "comme ceux que je decris, (avec couleur, taille parametrable,ect... en une seule fonction) serai un ++

Publié : mer. 08/nov./2006 15:49
par Backup
bon mon premier code Dreamotion3D

ceci est un code de base pour les grands débutants comme moi :D

j'ai mis un max de commentaires
j'utilise seulement les formes predefini dans le moteur, donc le plus simple pour tous les grands débutants comme moi :D

aucune texture (je sais encore pas comment ça marche :lol: )

juste une lumière pour "voir" le résultat :D

il suffit de commenter chaque objets pour le voir dans le moteur
bien sur tout les objet se mette a la même position donc il faut commenter les objets précédemment décommenter sinon il y aura superposition des objets :D

voici le code


; Init different modules
; Fichiers Include
; voir le dreamotion3d.pbi pour le details des commandes reconnu
IncludePath "Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"

Enumeration
EndEnumeration

If InitSprite () = 0 Or InitKeyboard () = 0 Or InitMouse () = 0
     End
EndIf

SetCurrentDirectory ( "media/" )


DM_Graphics3D(1024,768, 32, #False , #False ) ; Initialize graphic windows


*Camera = DM_CreateCamera( #Null ) ; on cree une camera

; **************** bouger la camera ********************
;- bouger camera
posx=0 ; droite gauche ; pour le terrain
posy=550 ;monte/descends ; pour le terrain
poz=-20 ; avance/recule ; pour le terrain
DM_MoveEntity(*Camera, posx,posy,poz) ; on recule la camera
Rouge=25
Vert=125
Bleu=125
DM_CameraClsColor(*Camera, Rouge, Vert, Bleu) ; on choisi une couleur de fond
; near_distance.f=0
; far_distance.f=100000
; DM_CameraRange(*Camera, near_distance.f, far_distance.f); pres de la camera , loin de la camera
; **************************************************
;********* rotation de la camera **********************
;-rotation de camera
rotx.f=30 ; oui de la tete
roty.f=60 ; non de la tete
rotz.f=0 ; droite gauche pour un avion
DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; **************************************************


; on peut creer des objets
; ******** bouilloire *****************
;- creer une bouilloire
; *bouilloire=DM_CreateTeapot.l(#Null) ; on crée une bouilloire a the
  ; rotx=-30:roty=0:rotz=0
  ; DM_TurnEntity(*bouilloire, rotx,roty,rotz) ; on va tourner l'objet pour l'incliner de 30 degres
; DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; **********************************
; ******** Text 3d ******************
;-creer du text3D
; DM_CreateText3D.l("Comic Sans MS","DOBRO", 12, #Null) ; on peut creer du text
; rotx.f=0 ; oui de la tete
; roty.f=0; non de la tete
; rotz.f=0; droite gauche pour un avion
; DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; **********************************
; ****** Cylindre *******************
;-creer un cylindre
; *cylindre=DM_CreateCylinder.l(16, #Null); on peut creer un cylindre avec 16 cotés
; rotx=-90:roty=0:rotz=0
; DM_TurnEntity(*cylindre, rotx,roty,rotz) ; on va tourner l'objet pour le mettre debout
; rotx.f=0 ; oui de la tete
; roty.f=0; non de la tete
; rotz.f=0; droite gauche pour un avion
; DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; *********************************
; ****** Cone *******************
;-creer un cone
; *cone=DM_CreateCone.l(8, #Null) ; on peut creer un cylindre avec 8 cotés
; rotx=-90:roty=0:rotz=0
; DM_TurnEntity(*cone, rotx,roty,rotz) ; on va tourner l'objet pour le mettre debout
; scalex.f=0.50: scaley.f=0.25: scalez.f=0.5
; DM_ScaleEntity(*cone, scalex.f, scaley.f, scalez.f); on change l'echelle du cone
; rotx.f=0 ; oui de la tete
; roty.f=0; non de la tete
; rotz.f=0; droite gauche pour un avion
; DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; *********************************
; ****** Cube *******************
;- creer un Cube
; *cube=DM_CreateCube.l(#Null) ; on peut creer un Cube
  ; rotx=-45:roty=20:rotz=0
  ; DM_TurnEntity(*cube,rotx,roty,rotz) ; on va tourner l'objet
  ; scalex.f=2: scaley.f=2: scalez.f=2
  ; DM_ScaleEntity(*cube, scalex.f, scaley.f, scalez.f); on change l'echelle du cone
; rotx.f=0 ; oui de la tete
; roty.f=0; non de la tete
; rotz.f=0; droite gauche pour un avion
; DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; *********************************
; ****** Sphere *******************
;-Creer une sphere
; DM_CreateSphere.l(32,#Null) ; on peut creer une sphere avec 32 segments
; rotx.f=0 ; oui de la tete
; roty.f=0; non de la tete
; rotz.f=0; droite gauche pour un avion
; DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; *********************************
; ****** Tore *******************
;-creer un tore
; InnerRadius.f =1 ; taille interieur
; OuterRadius.f=5 ; taille exterieur
; Sides.l=8 ; nombre de segment pour le "pneu"
; Rings.l=6 ; nombre de segment pour la "roue"
; *tore=DM_CreateTorus.l(InnerRadius.f, OuterRadius.f, Sides.l, Rings.l, #Null) ; on peut creer un Tore
; rotx=45:roty=0:rotz=0
; DM_TurnEntity(*tore,rotx,roty,rotz) ; on va tourner l'objet
; rotx.f=0 ; oui de la tete
; roty.f=0; non de la tete
; rotz.f=0; droite gauche pour un avion
; DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
; *********************************

; ****** Terrain*******************
;-creer un terrain
*terrain=DM_CreateTerrain( "map.jpg" , 1) ; le terrain est crée d'apres une image en niveau de gris
; *********************************
; posx.f=0
; posy.f=50
; posz.f=0
; DM_PositionEntity(*terrain, posx.f, posy.f, posz.f)
 

; ****** Lumiere *****************
  ; cree une petite lumière, type POINT
;-creer une lumiere
light = DM_CreateLight(1, Null)
Red.w=255
Green.w=10
Blue.w=100
Alpha.w=2
DM_LightColor(light, Red.w, Green.w, Blue.w, Alpha.w) ; change la couleur de la lumiere
; *********************************


Repeat
     ExamineKeyboard ()
     ExamineMouse ()
     ShowCursor_ (1)
     If KeyboardReleased ( #PB_Key_Escape ) Or WindowEvent ()= #PB_Event_CloseWindow
        Quit=1
     ElseIf KeyboardPushed ( #PB_Key_Up )
        poz=1
        DM_MoveEntity(*Camera, 0,0,1) ; on recule/avance la camera
     ElseIf KeyboardPushed ( #PB_Key_Down )
        poz=-1
        DM_MoveEntity(*Camera, 0,0,-1) ; on recule/avance la camera
     ElseIf KeyboardPushed ( #PB_Key_Left )
         ;rotx.f=30 ; oui de la tete
        roty.f= roty.f-0.1 ; non de la tete
         ;rotz.f=0; droite gauche pour un avion
        DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
     ElseIf KeyboardPushed ( #PB_Key_Right )
         ; rotx.f=30 ; oui de la tete
        roty.f=roty.f+0.1 ; non de la tete
         ; rotz.f=0; droite gauche pour un avion
        DM_RotateEntity(*Camera, rotx.f, roty.f, rotz.f)
     EndIf
     If MouseButton ( #PB_MouseButton_Left )
        DM_TurnEntity(*Camera, MouseDeltaY ()/8, MouseDeltaX ()/8,0)
     EndIf
    
    
    
     ; Render c'es ce qui permet de voir le resultat !
    DM_BeginScene()
    DM_RenderWorld()
    DM_EndScene()
     ; *************************************
Until Quit=1

DM_ClearGraphics()

End

Publié : mer. 08/nov./2006 18:52
par cha0s
je lance l'idée comme sa au cas ou sa pourrait interesser ,ce serait d'integrer le gui de SOCPB 2006 meme si il est loin d'etre finit et aurai besoin d'un petit debugage sa pourrait etre sympa.

Publié : mer. 08/nov./2006 18:55
par tmyke
@Dobro Pour les includes, ton idée est bonne mais je me heurte
a un soucis. Les fichiers include devrais alors etre toujours positionné dans le
meme dossier pour commancer, ensuite il s'agit de fichiers include PB, mon
moteur étant écris en C/C++, je ne sais pas comment faire pour include le
wrap PB directement, je n'est pas asser d'expérience sous PureBasic.
Pour tes idée de 'mega-objets', je la retiens et je la met dans la liste de suggestion a voir...


Sinon, la section Tuto (vide pour l'instant) de la doc sera la pour les débutants, et amener les non 3D vers la 3D le plus en douceur possible...
:)

Publié : mer. 08/nov./2006 18:59
par Dr. Dri
Dobro a écrit :plusieurs suggestions :D

ne pourrai tu pas créer une fonction style "init_engine" qui permette
d'éviter d'avoir a insérer systématiquement les lignes :

Code : Tout sélectionner

; Fichiers Include 
IncludePath "Include"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"
bref pour chaque langage supporté par ton moteur
il suffirai d'indiquer un "init_engine" qui se chargerai de charger les bon includes , ceux-ci pourrai etre dans le moteur au lieu d'être externes non ?
Bah il peut créer un resident qui contiendra structures intarfaces constantes et macros (pas les datasection)

je connais pas le contenu des fichiers mais ca doit etre faisaible

Dri

Publié : mer. 08/nov./2006 19:06
par Patrick88
DM_CreateCube
DM_CreateSpere
DM_CreateCylindre
DM_Create...

DM_CreateFace
DM_CreateArc
DM_CreateLine

des trucs style 3dgc / darkbasic

pat

Publié : mer. 08/nov./2006 20:31
par Flype
suite à ce post :
http://purebasic.forum-gratuit.com/viewtopic.php?t=5484

il serait aussi intéressant que DreamMotion3D intègre un jeu de fonctions pour gérer plusieurs joysticks.
[...]tout le mérite de la lib de dr dri c'est qu'elle utilise directement via DirectX qui lui supporte le forcefeedback mais le hic c'est que ce n'est pas simple à implémenter.

je pense que la lib de dr dri devrait etre fusionnée à DreamMotion3D.
il y a déjà toutes les includes / api directx dans dm3d donc il y a plus qu'à coller le source quelque part dans le source de tmyke.

qu'en pense tmyke ?
en effet,

. DreamMotion3D utilise DirectX
. DreamMotion3D est un moteur 3D pour faire des jeux 3D

donc on peut supposer qu'un programmeur se lançant dans un jeu avec DreamMotion3D va avoir besoin à un moment donné de fonctions joysticks.

Publié : mer. 08/nov./2006 21:27
par tmyke
Humm, oui, en fait coder des fonctions a base de DirectInput. Pourquoi pas en effet.
Voir donc pour intégrer la lib dans DM3D en quelque sorte si je comprend bien... Si Dri est partant alors pourquoi, bien au contraire. Je viens de télécharger et je regarde cela ...

Publié : mer. 08/nov./2006 21:35
par Anonyme
Oui, et si possible rajouté le force feedback :D
et la gestion du surround
et la gestion du --->[] #spin

Publié : mer. 08/nov./2006 21:38
par Flype
si ca continue ca va plus etre DreamMotion3D mais DreamWorld3D :)