[n3xt-D] un moteur pour PureBasic

Généralités sur la programmation 3D
Anonyme

Message par Anonyme »

petits bugs étrange ( sous linux ) :


La scéne comporte 2 cubes
1 pour l'arme ( peut pas posté un mesh...)
l'autre le point de tir de l'arme ( le bout du canon quoi...)

1° bug :

- Change la vitesse du bullet a la ligne 103
de 0.01 passe la à >1

le bullet ne sera plus créer sur le point de tir ( 2° Cube )


2° bug : change le scale du 1° cube ( l'arme)
avec par exemple : 0.1,0.1,0.5
et amuse toi a tirer dans tout les sens pour constaté le bug.

Code : Tout sélectionner

IncludePath "includes"   :   IncludeFile "n3xtD_PB.pbi"


*app = iCreateGraphics3D(800,600)
iSetAntiAlias(#True)
;*app = iCreateGraphics3D(800,600, 32, #False, #True)
If *app= #Null
  End
EndIf



iTextureCreation( #ETCF_CREATE_MIP_MAPS, #False  )
	*sky.IMesh = iCreateSkydome( iLoadTexture("medias/env_sky.jpg"), 64, 2, 1, 1.5, #Null )
iTextureCreation( #ETCF_CREATE_MIP_MAPS, #True  )


*l = iCreateLight($FFFFFF,10000)
iPositionNode(*l, 100,100,100)

Define *cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,0,0)
iNearValueCamera(*cam,0.01)



; ARME
;Global *obj.IObject = iLoad3DObject("medias/gun.b3d")
Global *gun.IMesh = iCreateCube(0.1,*cam);iCreateMesh(*obj,*cam)
;iScaleNode(*gun,0.3,0.3,0.5)
iTranslateNode(*gun,0.2,-0.2,0.35)

Global *shoot_point = iCreateCube(0.1,*gun)
iTranslateNode(*shoot_point,0.0,0.05,0.4)


Structure BULLETS
	*Node.i
	Direction.VECTOR3
	Position.VECTOR3
EndStructure


Global NewList Bullet.BULLETS()









Repeat


  
 	; move camera with dir key and mouse (left click)
  If iGetKeyDown(#KEY_ARROW_UP)
    iMoveNode(*cam, 0,0,0.5)
  EndIf
  If iGetKeyDown(#KEY_ARROW_DOWN)
    iMoveNode(*cam, 0,0,-0.5)
  EndIf
  If iGetMouseEvent(#MOUSE_BUTTON_LEFT)
  		If flagXDown=0
  			omx = iGetMouseX()
  			omy = iGetMouseY()
  			flagXDown=11
  		Else
  			moy = iGetMouseY()-omy
  			angley=(moy/10.0)
  			omy= iGetMouseY()
  			mox = iGetMouseX()-omx
  			anglex=(mox/10.0)
  			omx= iGetMouseX()
  			iTurnNode(*cam, angley, anglex,0)
  		EndIf
  Else
  	 		flagXDown=0
  EndIf



If iGetMouseEvent(#MOUSE_BUTTON_RIGHT) And shoot_timer < ElapsedMilliseconds()
		shoot_timer = ElapsedMilliseconds()+250
		AddElement(Bullet())
			iNodePosition(*shoot_point, @Bullet()\Position\x)
     	iNodeRotation(*shoot_point, @Bullet()\Direction\x)
      Bullet()\Node  = iCreateCube(0.1)
      iPositionNode( Bullet()\Node, Bullet()\Position\x,Bullet()\Position\y,Bullet()\Position\z)
 			iRotateNode(Bullet()\Node, Bullet()\Direction\x,Bullet()\Direction\y,Bullet()\Direction\z)
EndIf 




ForEach Bullet()
 	iMoveNode(Bullet()\Node,0,0,0.01)
Next 






	; if Escape Key, exit	
  If iGetKeyDown(#KEY_ESCAPE)
    Quit=1
  EndIf




  	; ---------------
  	;      Render
  	; ---------------
  iBeginScene()
    iDrawScene()
  ;  iDrawText(*font, "SkyDome demo",  10,10,0,0, $ff00ffff)
  iEndScene()


Until Quit=1
; end
iFreeEngine()
Anonyme

Message par Anonyme »

autre bug :

je devrais avoir au moins le message "ICI" dans le debugger , la rien...
peut on se passer du callback et faire le traitement en direct comme pour les commandes natives de PB ?

Code : Tout sélectionner

;------------------------------------------------------------------
; callback procedure for event interpret
ProcedureC GUIEventCallBack(eventGUI.l, idGUI.l,  *GUIElement.IGUIElement) 
Debug "ICI!"

   If( eventGUI=#EGET_SCROLL_BAR_CHANGED)
      idx.l = iGUIScrollBar_Pos(*GUIElement)
      Debug idx
   EndIf

   If( eventGUI=#EGET_SPINBOX_CHANGED)
      ids.f = iGUISpinBox_Value(*GUIElement)
      Debug ids
   EndIf
     
   If( eventGUI=#EGET_TABLE_CHANGED)
    row.l = iGUITable_Selected(*GUIElement)
    column.l = iGUITable_ActiveColumn(*GUIElement)
    Debug iText( iGUITable_CellText.l(*GUIElement, row, column )  )
   EndIf
     
      
EndProcedure
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Concernant le soucis avec les BULLETs, c'est un bug de la fonction iMoveNode. C'est corrigé, je
fais un update des packages avant la fin de matiné, je poste quand c'est fais.

Pour le CallBack des fonctions GUI, en fait la procedure n'est appelée que lorsque un event
GUI est généré. Donc, le Debug "ICI!" n'a pas vraiment d'effet dans les autres cas.
A moins que quand tu agisses sur les éléments GUI tu n'es rien non plus, ce qui ne serait pas normal,
par contre chez moi cela fonctionne, sous Window.
Force et sagesse...
Anonyme

Message par Anonyme »

Ok pour le callback. ca n'affiche rien avec le debugger , avec printn() sa fonctionne. va comprendre... :D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

effectivement, va comprendre Image

Sinon j'ai uploadé le package SourceEngine et n3xtd for PureBasic, cela devrait normalement solutionner
le soucis sur les Bullet.
Force et sagesse...
Anonyme

Message par Anonyme »

Ca compile sans erreur se coup si ^^

iMoveNode() fonctionne

cependant , si je scale le gun ( ligne 33 du code plus haut )
le tir sous différent angle est très bizarre :
Global *gun.IMesh = iCreateCube(0.1,*cam);iCreateMesh(*obj,*cam)
iScaleNode(*gun,0.3,0.3,0.5)
iTranslateNode(*gun,0.2,-0.2,0.35)
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Oui, effectivement, les effets sont étranges. Je regarde cela. Image

La fonction ScaleNode semble perturber les fonction de rotation.
Force et sagesse...
Anonyme

Message par Anonyme »

je viens d'essayer d'incorporer la Lib XEffect Reloaded

Image


Y a quelque fichier à incorporer dans les sources de n3xtd
une petite modif a faire sur le makefile ( rajouté les cpp )
mais j'ai des erreurs de compil du style :
EffectHandler.h:192: erreur: «irr::core::dimension2du» has not been declared
voilà mon fichier d'export de fonction :

n3xtd_XEffects.cpp
#include <irrlicht.h>

#include <iostream>



// Remember to include "XEffects.h" in every project that uses XEffects, and add all the XEffects .cpp

// files to your project/makefile.

#include "XEffects.h"



// Namespaces.

using namespace irr;

using namespace scene;

using namespace video;

using namespace core;



#pragma comment(lib, "irrlicht.lib")


#include "n3xtd_dir_compil.h"

#include "n3xtd_Constantes.h"

#include "n3xtd_EventReceiver.h"

#include "n3xtd_GlobalEnvironement.h"

extern GlobalEnv globenv;


#define EXT_FILTER_NONE 1
#define EXT_FILTER_4_PCF 2
#define EXT_FILTER_8_PCF 3
#define EXT_FILTER_12_PCF 4
#define EXT_FILTER_16_PCF 5



E_FILTER_TYPE filterType;


dimension2du ScreenRTT =

// Comment JUST the next line if "getVendorInfo()" is not defined.

!driver->getVendorInfo().equals_ignore_case("NVIDIA Corporation") ? dimension2du(512, 512) :

driver->getScreenSize();

EffectHandler* effect = new EffectHandler(globenv.device, "shaders", ScreenRTT, true);





extern "C" DllExp void ext_iSetFilterType(int type)
{
filterType = (E_FILTER_TYPE)core::clamp<u32>((u32)type - '1', 0, 4);
}



extern "C" DllExp void ext_iSetAmbientColor(int alpha,int red,int green,int blue)
{
effect->setAmbientColor(SColor(alpha,red,green,blue));
}


extern "C" DllExp void ext_iAddShadowToNode(ISceneNode *node)
{
effect->addShadowToNode(*node, filterType);
}

C'est ou que j'foire ? 8O

@+
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Bon, pour ce qui est des soucis de ScaleNode, j'ai cherché et grenouillé sur le forum officiel,
et il s'avère que le soucis vienne de la façon dont je récupère les valeur de rotations, je vais revoir
le truc, c'est en partie du à des soucis entre les Parent/Childs, Update la dessus d'ici à
ce soir normalement. ;)

Pour ce qui est de Lib XEffect Reloaded , je vais essayer, et je te tiens au courant, je ne suis pas
là cet après midi, mais ce soir je devrait avoir le temps de m'y coller et donc de voir ce qui ne va pas
par rapport à ce que tu a commencé.
Force et sagesse...
Anonyme

Message par Anonyme »

Impec ^^

iVisibleNode(*node,State.b)

c'est très bien comme commande , sauf que l'objet ne peut plus subir l'influence des parents , je me sers d'un cube au bout du canon de mon arme pour créer mes bullets , mais si je le cache , bah , ca ne marche plou :D

ps: je peut utiliser les pivots , mais bon , un pivot sert à pivoter :D

@+
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Le pivot sert effectivement le plus souvent comme une entité intermédiaire, pour les articuler,
mais c'est en fait une entité virtuel (node devrais-je dire), qui va très bien dans ton cas pour ce que tu
veux faire ;)
Force et sagesse...
Anonyme

Message par Anonyme »

petite suggestion , pour les billboards , pourrais ton choisir la valeur alpha ?

edit :

iGetMouseX() & y()

peut on aussi avoir un complément , du genre iGetMouseDeltaX() ?
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Bon, je viens de faire une petite update (la 11c).

Pour ce qui est du soucis lié au scale.
En fait j'ai du faire deux type d'instructions iNodeRotation.
Une qui s'appèle toujours iNodeRotation et qui récupère la rotation relative d'un node (attention,
pour les childs, c'est souvent 0), et une instruction iNodeAbsoluteRotation, qui récupère la rotation
absolu d'un node, à ceci près que pour cette dernière, il y a un bug sous Irrlicht, quand il y a un
scaleNode, Irrlicht à du mal à retrouver les bonne valeurs de rotations absolu des enfants.
Il faut donc dans ce cas toujours se baser sur le princpal parent. Dans ton code du haut, il est préférable d'écrire:

Code : Tout sélectionner

      AddElement(Bullet())
      iNodePosition(*shoot_point, @Bullet()\Position\x)
      iNodeRotation(*cam, @Bullet()\Direction\x)

Pour ce qui est des Billboard, c'est obselète. Passes plutôt par les sprites3D, plus performant et
et plus souple. Tu n'aura aucun mal à faire dessus des réglages d'Alpha.

Sinon, j'ai ajouté les deux instructions iGetDeltaMouseX et iGetDeltaMouseY(). En espérant que cela
corresponde à ce que tu attendais...
Force et sagesse...
Anonyme

Message par Anonyme »

Il faut donc dans ce cas toujours se baser sur le princpal parent. Dans ton code du haut, il est préférable d'écrire:
Ha , mais imagine que j'ai envie de faire une grue avec 4 articulations et au lieu d'une pelleteuse , je veut lui collé une mitrailleuse :D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Cpl.Bator a écrit :Ha , mais imagine que j'ai envie de faire une grue avec 4 articulations et au lieu d'une pelleteuse , je veut lui collé une mitrailleuse :D
Pas de problème, faut juste que tu t'assure que tu n'a pas à employer l'instruction iScaleNode sur les éléments du bras de ta pelleteuse, c'est tout.
Et dans ce cas là tu n'aura pas de soucis.Le problème ne surgie que lorsque l'on emploie des ScaleNode sur les
enfants et que l'on veut récupérer les rotations de ces derniers...
Force et sagesse...
Répondre