Page 20 sur 62
Publié : dim. 12/nov./2006 14:27
par djes
Dräc a écrit :djes a écrit :
Pour ta première question, il y a DM_CameraProjRatio, dont le dernier paramètre permet de changer la perspective.
Ce dernier parametre permet de régler le fond du champ de la caméra, c'est à dire la plan jusqu'où la scène doit etre rendue...
Non je ne pense pas, dixit la doc : "Affecte des nouvelle valeur de calcul pour la matrice de projection d'une Entity camera, en fonction d'une largeur, hauteur et profondeur de champ"
Jouer avec la profondeur de champ, c'est jouer avec la perspective.
Publié : dim. 12/nov./2006 19:13
par Dräc
J’ai beau chercher, je n’ai pas trouvé le moyen de maitrise la taille de la fenetre de rendu 3D !
Je ne suis pas sur d’utiliser les bons termes, mais DM_CameraViewPort() permet de place et de redimensionner une vue de la scène dans la fenetre de rendu 3D.
Or, les dimensions de la fenêtre de rendu 3D semblent liées à celles de la fenêtre mère.
Si j’ai bien saisi, cela a lieu avec DM_InitGraphics :
Code : Tout sélectionner
DM_hwnd = OpenWindow()
res= DM_InitGraphics(DM_hwnd, Depth, Fullscreen ,sync)
Dès lors, a chaque rendu de la scène, si la fenetre mère contient des gadgets, ils sont effacés.
Est-il possible d’envisager de fixer la taille de la fenetre de rendu 3D comme étant différente de celle de la fenetre mère?
Pour aller plus loin, peut-on imaginer pouvoir choisir une taille pour la fenêtre de rendu 3D et que la scène ne soit pas distordue lorsque l’on redimensionne la fenêtre mère?
Actuellement, on perd tout logiquement le ratio lors du dimensionnement de la fenêtre mère.
Autre question, se sert-on vraiment des variables DM_WIDTH et DM_HEIGHT ?
Publié : dim. 12/nov./2006 19:18
par Dr. Dri
bah ce que tu demandes, c'est de faire l'équivalent de openwindowedscreen
Dri
Publié : dim. 12/nov./2006 19:28
par Dräc
C'est effectivement ce que j'ai écrit précédemment...
Dräc a écrit :Incruster la scène dans tout ou partie d’une fenêtre Windows (à l’image d’un OpenWindowedScreen() ), afin de pouvoir intégrer la scène dans un éditeur qui utilise les gadgets PB.
Publié : dim. 12/nov./2006 20:13
par tmyke
Je comprend beaucoup mieux ta démarche. En fait et dans l'état actuel des
choses, cela n'est pas possible. En modifiant certaines init en interne du moteur
cela sera surement possible...
Mais en attendant, n'est-il pas possible pour profiter des Gadget, d'ouvrir dans la
fenetre principale, une fenetre fille, interne, sans bord et de faire l'init de DM3D
au sein de cette fenetre (via le Handle) et donc de profiter du reste de la
fenetre mère pour les menu et autres Gadgerts ?
Publié : dim. 12/nov./2006 20:15
par cha0s
Dräc a écrit :J’ai beau chercher, je n’ai pas trouvé le moyen de maitrise la taille de la fenetre de rendu 3D !
je sait pas si tu a vue mon code dans le lien que je t'ai envoyé mais l'astuce que j'ai trouvé c'est de metre le rendue de DM3D dans une fenetre fille et de metre les gadget dans la fenetre mere comme sa plus de problem
Edit : tmyke a été plus rapide :p
sinon apres pas mal de bidoulle j'ai pas mal avancé sur mon petit editeur et j'obtient quelque chose de plutot sympathique :
par contre la commande DM_HeightTerrain() et plutot lente l'orsque j'utilise de gros pinceau pour editer la hauteur (la taille max est 20x20 soit 400 hauteur a modifier).
Publié : dim. 12/nov./2006 20:27
par tmyke
Oui, la fonction 'DM_HeightTerrain()' est asser lente surtout sur les pinceau asser gros, car
on agit directement sur le vertexBuffer de chaque Quad, vertex par vertex, donc voila pourquoi...
Ton code sur ton éditeur sera--t-il en ligne un jour sinon ?
Publié : dim. 12/nov./2006 20:29
par cha0s
entierement non mais je donnerai surement une version lite pour faire profiter tout le monde.
Publié : dim. 12/nov./2006 20:45
par Dräc
@tmyke: merci pour la réponse. La solution proposée n'est pas très éloignée du besoin
@cha0s: biensur que j'ai trouvé, merci

Tu as aussi du scintillement lorsque tu balades la fenetre devant la zone de rendu?
Publié : dim. 12/nov./2006 21:13
par Dr. Dri
autre suggestion : utiliser le gadgetid d'un containergadget au lieu du windowid d'une fenetre
c'est pas possible ?
Dri
Publié : dim. 12/nov./2006 21:14
par cha0s
Dräc a écrit :@tmyke: merci pour la réponse. La solution proposée n'est pas très éloignée du besoin
@cha0s: biensur que j'ai trouvé, merci

Tu as aussi du scintillement lorsque tu balades la fenetre devant la zone de rendu?
j'ai eu ce problem en effet au final j'ai reintegré le rendue de la scène dans la boucle principal et suprimé le thread .
Dr. Dri a écrit :autre suggestion : utiliser le gadgetid d'un containergadget au lieu du windowid d'une fenetre
c'est pas possible ?
Dri
j'ai essayé avec un image gadget et a par le crash de l'apli j'ai rien obtenue d'autre ,je me suis bassé sur l'exemple de iricht.
Publié : lun. 13/nov./2006 8:54
par Progi1984
Un ImageGadget doit contenir une image alors qu'un ContainerGadget peut contenir n'importe quel autre gadget ou fenetre !
Publié : lun. 13/nov./2006 18:48
par Dr. Dri
bah faut tester... en tout cas openwindowedscreen fonctionne dans un conainer
Code : Tout sélectionner
If InitSprite() = 0
MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
End
EndIf
If OpenWindow(0, 0, 0, 260, 160, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ButtonGadget(0, 200, 135, 45, 20, "Quit")
ContainerGadget(1, 20, 0, 160, 160)
EndIf
If OpenWindowedScreen(GadgetID(1), 0, 0, 160, 160, 0, 0, 0)
CreateSprite(0, 20, 20)
If StartDrawing(SpriteOutput(0))
Box(0, 0, 20, 20, RGB(255, 0, 155))
Box(5, 5, 10, 10, RGB(155, 0, 255))
StopDrawing()
EndIf
Else
MessageRequester("Error", "Can't open windowed screen!", 0)
End
EndIf
EndIf
direction = 2
Repeat
; It's very important to process all the events remaining in the queue at each frame
;
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Gadget
If EventGadget() = 0
End
EndIf
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
DisplaySprite(0, x, x)
x + direction
If x > 140 : direction = -2 : EndIf
If x < 0 : direction = 2 : EndIf
Delay(1)
ForEver
Dri
Publié : lun. 13/nov./2006 19:49
par tmyke
Impect, et en extrapolant, le code suivant marche donc très bien apparement:
Code : Tout sélectionner
; Fichiers Include
IncludePath "Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"
Global *mesh.CEntity
Global *camera.CEntity
If InitSprite() = 0
MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
End
EndIf
If OpenWindow(0, 0, 0, 260, 160, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ButtonGadget(0, 200, 135, 45, 20, "Quit")
ContainerGadget(1, 20, 0, 160, 160)
EndIf
If OpenWindowedScreen(GadgetID(1), 0, 0, 160, 160, 0, 0, 0)
DM_hwnd = GadgetID(1)
DM_InitGraphics(DM_hwnd, 32, 0 ,1)
*DM_d3d9 = DM_GetD3D9()
*DM_d3dDev9 = DM_GetDevice9()
DM_WIDTH = 160
DM_HEIGHT = 160
Else
MessageRequester("Error", "Can't open windowed screen!", 0)
End
EndIf
EndIf
SetCurrentDirectory("media/")
*mesh = DM_LoadEntity("tiger.x")
*camera = DM_CreateCamera()
DM_MoveEntity(*camera, 0,0,-100.0)
Repeat
; It's very important to process all the events remaining in the queue at each frame
;
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Gadget
If EventGadget() = 0
End
EndIf
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
DM_TurnEntity(*mesh,0,1,0)
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
ForEver
DM_ClearGraphics()
End
Publié : mar. 14/nov./2006 0:14
par Dräc
Il est vrai que tout étant "fenêtre" sous Windows, on peut certainement décliner les exemples à outrance.
C'est plutôt un bon point!
Un bémol cependant sur la méthode OpenWindowedScreen().
Cela n'a pas bcp d'interet à mes yeux car alors on crée un double Buffer dont on ne se servira pas.
Sinon, tmyke, je te vois initialiser DM_WIDTH et DM_HEIGHT dans les codes, mais servent-ils vraiment pas la suite. J'ai beau les faire varier, je ne vois aucun résultat sur le rendu?
Autre question: j'imagine qu'il est prévu de pouvoir imposer une image de fond.
Typiquement, toutes les présentations n'ont qu'un ciel uni.
Je suis un peu tordu, mais je suis interessé à superposer sur une vue 2D classique (Tilebased game) une vue 3D afin de bénéficier des performances d'un moteur 3D (bien comprendre alors que la camera peut avoir n’importe quelle orientation).
Je suis conscient que l'intérêt est limité et hybride, mais cette solution peut etre obtenue de 2 manières:
- Soit permettre la superposition du rendu 3D de DM sur n'importe quel fond. Cela implique la gestion de la transparence.
Dans ce cas, la méthode OpenWindowedScreen() précédente a un interet.
- Soit que DM autorise l'afficher de sprites (ou une image) positionnés en arriere plan et qui seraient statiques vis à vis de la scène.
La premiere méthode me semble là plus pertinente, du moment qu’il est possible d’imposer une couleur de transparence et un niveau d’opacité des entities… (c'est une des fonctionnalité offerte par la bibliothèque 3D de PB)