[n3xt-D] un moteur pour PureBasic

Généralités sur la programmation 3D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

[n3xt-D] un moteur pour PureBasic

Message par tmyke »

Comme promis, depuis trois-quatre semaines désormais, je me suis donc attelé à la réalisation de 'l'après' Dreamotion3D.
Toujours dans l'optique de la création 3D ludique à travers PureBasic. Même si je sais que le nombre d'amateurs
potentiels est très limité (pour l'instant), voici un point complet sur ce projet naissant.


LES OBJECTIFS DE BASE:
--------------------------------
Le principal objectif de ce projet est donc au départ de pouvoir fournir une alternative crédible en matière de moteur 3D
à celui proposé par PureBasic dans son package initial, avec à la clé un certains nombres de spécifications de bases ayant
pour objectif globalement (si possible) les éléments suivant:
- moteur simple, complet et facile d'accès, s'inscrivant dans la même veine de ce qu'était Dreamotion3D sur le principe.
- projet opensource et gratuit,
- projet ayant une capacité multiplateforme.
- pas d'usine à gaz hyper gourmandes en ressource.
- moteur relativement complet, intégrant 3D, collisions et physique, GUI, etc..


CHOIX DU MOTEUR:
---------------------------
Ne voulant pas repartir de zéro (au vue du travaille que cela représente), j'ai donc cherché à m'appuyer sur un moteur déjà
existant, je suis donc partis en quête du moteur 3D type pour mener à bien ce projet.

Plus que la réalisation d'un simple wrap, il s'agit en fait de refaçonner le dit-moteur dans certains cas pour
le faire coller au mieux aux principaux objectifs visés. A la base donc, je me suis rapidement fixé un certains nombres
de contraintes pour arrêter un choix et ce, pour resserrer le cercle des moteurs existant:

1- moteur gratuit / OpenSource: désireux de coller au mieux au projet et à l'idée que je m'en fait, pouvoir rentrer et modifier
le code natif du moteur choisi est un argument très important. De plus, ce projet n'à aucune vocation vénale.

2- moteur multiplateforme: ne voulant laisser aucune plateforme sur le bord de la route, il est important de choisir un moteur
existant ayant cette capacité. Je ne tripatouille plus depuis longtemps avec Linux, et je n'ai jamais touché de ma vie à un Mac,
mais tous sera fait pour qu'une adaptation vers ces plateformes ne soit pas trop laborieuse.

3- moteur simple et pas trop lourd: il ne s'agit pas de se prendre la tête avec le code du moteur et son adaptation. Il faut donc un
moteur pas trop lourd, et dont le maniement interne ne relève pas d'un véritable calvaire. En final, une simple DLL ou lib, c'est
tout.

4- moteur ouvert, surtout niveau media: ce critère, non rédhibitoire ceci-dit, est aussi à prendre en compte. En d'autres termes,
les moteurs aux formats 3D propriétaires sont si possible à éviter.

5- moteur pas trop gourmand: dans la mesure du possible aussi, il est fortement souhaitable de s'appuyer sur un moteur pas trop
gourmand, et donc pouvant tourner sur des configurations modestes et pas forcement dernier cries. Donc pas de moteur soit disant
'nex-gen', nécessitant des conf de brutes pour tourner à peu près convenablement.


En ayant en tête toutes ces contraintes, j'ai testé et regardé de près tout ce qui pouvait se faire en terme de moteur 3D sur le
'marché' (sur les projets un tant soit peu sérieux et établis bien sûr).
J'ai donc passé en revue pendant plus d'une semaine, entre-autre: Ogre - Irrlicht - Hordes3D - OpenSceneGraph - CrystalSpace -
etc...

Mon choix c'est finalement arrêter sur Irrlicht. Explication (en reprenant la liste des pseudo-spécifications énumérées ci-dessus):

1-moteur gratuit et OpenSource: c'est le cas d'Irrlicht
2-moteur multiplateforme: ce moteur tourne très bien depuis déjà un bon moment sur toutes les plateformes, d'ailleurs la communauté
Irrlicht possède certainement l'une des plus impressionnantes part d'utilisateur 'non-Windows'.
3-moteur simple et pas trop lourd: une simple DLL, qui pèse moins de 2Mo, c'est l'un des plus léger de ceux testés (Ogre = 7 DLL et
60Mo de lib à lier) (Hordes3D, 3 DLL) (etc...).
4- moteur ouvert, surtout niveau media: Irrlicht n'a pas de format propriétaire. Il s'apuis sur des formats existant (3DS, B3D, X,
Collada, MD2, BSP, CSM, DeleD, Ogre, Maya, etc...), plus d'une dizaine en tout.
5- moteur pas trop gourmand: Irrlicht tourne plutôt bien sur toute les conf, même les moins récentes. De simples cartes intégrés
ne lui font pas peur..


Bref, ce choix d'Irrlicht c'est imposé finalement logiquement et naturellement. Certes, ce moteur a aussi ces défauts (le moteur parfait
n'existe pas, ou alors je ne le connait pas), comme un manque de performances certains dès que les scene s'alourdissent, quelques
fonctions non aussi poussées que certains de ces concurrents. Mais comme l'objectif n'est pas de réaliser un 'CryEngine2 like', il
devrait être assez aisé de s'accommoder des ces quelques lacunes. D'autant qu'au fil du temps il sera plus que largement possible de
combler ces lacunes par l'apport de codes 'maison', ce que j'ai déjà commencé à faire. C'est aussi l'un des 'plus' d'Irrlicht, sont fort
taux d'abstraction permet d'insérer nos codes personnels pour en améliorer les capacités, et ce de façon simple. Irrlicht lui même évolue
très vite, et dispose d'une bonne communauté, tout sera fait pour que les mise à jours soit facile et pas trop galère.





DUREE DE REALISATION:
---------------------
Pas vraiment de timing précis, comme souvent pour les projets amateur, mais je pense qu'avant la fin de l'été, cela devrait
commencer à avoir de la gueule.
De toute les façons, je mettrais à jour le package régulièrement, pour permettre de suivre et tester l'avancée du projet.



PACKAGE
-------------
Passons au choses plus concrètes. Voici un lien vers un premier package de test. Les fonctions sont encore très limitées (juste la
possibilité de créer et d'importer des mesh), soit environ 250 fonctions pour le moment, sur un total estimé de 1500 à 2000 à la base.
L'objectif principal de ce premier pack est de voir à quoi cela ressemble, de tester et de donner vos opinions et vos suggestions pour
ceux qui le souhaite.

version 20 (04-Fevrier-2010)
c'est ici->http://www.n3xt-d.org/_download/N3xtD_PBx86.zip


L'installation est simple, comme souvent, il suffit de copier les trois répertoires présent dans l'archive dans le répertoire de
PureBasic. C'est tout. Les exemples fournis sont là uniquement pour montrer l'emploi de certaines instructions très basic, et donc
ne sont en rien spectaculaire, donc pour le moment pas de screenshot qui dépotent

La doc est en Anglais (désolé), pour assurer d'emblée une capacité ouverte au projet, qui je l'espère dans l'avenir ne restera pas
cloisonné à la communauté francophone.
J'ai joint au package par contre un fichier CHM en Français (dans rep irrPBDoc), sous forme de tuto et reprenant certaines parties
d'un totu que j'avais écris il y a quelques temps. C'est à peaufiner et à pas mal améliorer. Cela explique les bases et permet
de bien débuter avec aussi un peu de théorie, même si cela manque encore de codes en guise d'exemples. C'est destiné aussi au vrai
débutants. Je tacherais de continuer à alimenter et améliorer ce fichier au fil de l'évolution du projet.


Le second lien, permet de télécharger le code source du moteur complet. ça c'est pour ceux qui voudront aller plus loin, ou par
simple curiosité. Et surtout si il y a un ou deux courageux pour voir comment faire une compilation avec Linux et Mac...
Pour le moment, pas de SVN, mais si le nombre d'amateurs désireux de s'impliquer au niveau du code source, ainsi que des
adaptations sur certaines plateforme est suffisant, alors cela s'imposera de lui même et cela sera fait...

version 20 (04-fevrier-2010)
c'est là->http://www.n3xt-d.org/_download/SourceEngine.zip


NOM
------
Tout projet se doit d'avoir un nom. Et n'étant pas vraiment quelqu'un de très créatif dans ce domaine, ce projet est toujours à la
recherche d'un nom. Pour le moment, j'ai nommé irrPB (c'est mieux que rien), mais je trouve ce nom trop lié à PureBasic.
En effet, même si ce travaille pour faire naitre quelque chose qui est d'abord et surtout destiné à PB, rien n'empêchera de l'utiliser avec
d'autre langages. Bien que ceci dit, irrPB, pourquoi pas quand même ;)

Donc, si quelques-uns ont des idées, lachez-vous, un nom finira bien par sortir du lot ;) .
Vallholl, grand créateur et utilisateur assidu d'Irrlicht, m'a proposé quelques pistes, par exemple T.I.L.E (The Irrlicht Layered Engine).
Dobro, d'une façon plus généraliste, avec sortis NEXT (écris N3XTD).



CONCLUSIONS:
------------
Voilà pour cette présentation de base. J'espère ne pas avoir été trop long et barbant, ne pas être à coté de la plaque non plus,
et ne pas avoir fait fuir.
Je sais pertinemment que les amateurs de programmation3D ne sont pas légions dans le coin, je suis habitué, et cela ne m'a jamais
vraiment découragé, donc je poursuit malgré tout le cap.

Ceux qui voudront apporter leur petite pierre seront bien évidement les bienvenues... :D


Image Image
Dernière modification par tmyke le sam. 11/juin/2011 10:20, modifié 34 fois.
Force et sagesse...
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: un moteur pour PureBasic

Message par beauregard »

:D
tmyke a écrit :Mon choix c'est finalement arrêter sur Irrlicht.
Avec ce moteur3D open source, il s'agit là du meilleur choix possible pour purebasic.

purebasic est le basic le plus performant.
Irrlicht est le moteur3D open source le plus performant.

Et les 2 ont un autre point commun: la méconnaissance du public. Tout ceux qui cherche autre chose que vb et ogre pour X raisons trouveront en la solution de pb+Irrlicht une alternative harmonieuse.

Si Fred ne laisse pas un ptit message, c'est que la logique n'est plus de ce monde...
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Anonyme

Message par Anonyme »

Incompilable sous linux.

- La source du moteur d'origine est mélangé avec tes exports en *.cpp
- le moteur d'origine compile avec :

Code : Tout sélectionner

make sharedlib
sudo mv ../../lib/Linux/libIrrlicht.so.1.5  ./usr/lib
mais il manque toute tes fonctions. :roll:

Cela dit bonne initiative.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

super !! :D

bon par contre je ne comprends pas un truc

dans l'exemple 002

celui ou l'on aperçois la terre dans un cube

pourquoi faire ceci ?


Code : Tout sélectionner


 ; load an 3D object 
  Global *obj.IObjet = iLoad3DObject("Earth.x")


; create a mesh with one of the 3D object loaded
  Global *sphere.IMesh = iCreateMesh(*obj)
pourquoi etre obligé de faire un mesh a partir d'un objet loadé ?? 8O

ne pourrai t'on pas utiliser directement *obj ?? 8O
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Dobro a écrit :super !! :D

bon par contre je ne comprends pas un truc

dans l'exemple 002

celui ou l'on aperçois la terre dans un cube

pourquoi faire ceci ?


Code : Tout sélectionner


 ; load an 3D object 
  Global *obj.IObjet =


; create a mesh with one of the 3D object loaded
  Global *sphere.IMesh = iCreateMesh(*obj)
pourquoi etre obligé de faire un mesh a partir d'un objet loadé ?? 8O

ne pourrai t'on pas utiliser directement *obj ?? 8O
Ouaip un truc qui ferait genre Global *sphere.IMesh = iCreateMesh(iLoad3DObject("Earth.x")) mais en direct dans le code

PS : Je crois que ej viens de dire un truc inutile...
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 :Incompilable sous linux.

- La source du moteur d'origine est mélangé avec tes exports en *.cpp
- le moteur d'origine compile avec ...
C'est tout a fait normal, comme je l'ai mentionné dans ma présentation, je
ne dispose plus de Linux, donc il n'y a pas dans le source fourni un
makefile permettant une construction du projet actuellement, mais uniquement
celui du moteur d'origine. Donc, il faudra qu'un amateur éclairé et volontaire
reprenne le makefile d'origine pour l'adapter au nouveau moteur, comme je l'ai
fait avec la version Windows ;) (normalement, rien de bien compliqué, cela vaut d'ailleurs aussi pour MAC)
Dobro a écrit :bon par contre je ne comprends pas un truc
dans l'exemple 002
celui ou l'on aperçois la terre dans un cube
pourquoi faire ceci ?
C'est une des petites chose qui change par rapport à certains moteurs.
Pour exploiter les objets3D venant de fichiers pré-définit, il faut
d'abord les charger en mémoire. Cela peut parraitre fastidieux au
prime abord, mais on se rend compte que c'est dans certains cas très
économe en terme de ressource, comme dans le sample004.pb.
Mais si la terminologie n'est pas adaptée, on est justement là pour en
parler.
J'explique un peut plus longuement la chose sur les mesh et leurs
subtilité dans le tuto en français qui se trouve dans le repertoire doc :)
(si ce n'est pas trop clair me le dire)

Progi1984 a écrit :Ouaip un truc qui ferait genre Global *sphere.IMesh = iCreateMesh(iLoad3DObject("Earth.x")) mais en direct dans le code

PS : Je crois que ej viens de dire un truc inutile...
ce code marche aussi, mais effectivement, cela revient au même (même si plus compacte) ;)

beauregard a écrit :Avec ce moteur3D open source, il s'agit là du meilleur choix possible pour purebasic.
j'espère, du moins dans l'esprit dans lequel je suis partis....
Force et sagesse...
Anonyme

Message par Anonyme »

Bon , j'ai réussi à compilé et à exécute un exemple sous linux.

Tout d'abord , les "bugs" des sources :

UCHAR n'existe pas dans irrPB.cpp

Code : Tout sélectionner

#ifndef WIN32
typedef unsigned char UCHAR;
#endif 
irrPB_mesh.cpp

ligne 119 :

Code : Tout sélectionner

scene::IMeshSceneNode* node = NULL;// new scene::CCylinderSceneNode(radius, length, tesselation, colorT, closeTop, oblique, parent, globenv.smgr, -1);
si je ne commente pas , j'ai un "indefined reference" , je ne suis pas rentré dans les détails

le Makefile :
VERSION = 1.5

# Irrlicht Engine 1.5

# Makefile for Linux

#

# To use, just run:

#

# make

#

# This will compile Irrlicht, create a static lib (libIrrlicht.a), and copy it

# into the subdirectory lib/Linux. That's all.

#

# If you want Irrlicht to be compiled as shared lib (libIrrlicht.so.versionnumber), then run:

#

# make sharedlib

# make install

#

# Please note that Irrlicht as shared lib is just experimental and

# probably not tested.

#



#List of object files, separated based on engine architecture

IRRMESHLOADER = CBSPMeshFileLoader.o CMD2MeshFileLoader.o CMD3MeshFileLoader.o CMS3DMeshFileLoader.o CB3DMeshFileLoader.o C3DSMeshFileLoader.o COgreMeshFileLoader.o COBJMeshFileLoader.o CColladaFileLoader.o CCSMLoader.o CDMFLoader.o CLMTSMeshFileLoader.o CMY3DMeshFileLoader.o COCTLoader.o CXMeshFileLoader.o CIrrMeshFileLoader.o CSTLMeshFileLoader.o CLWOMeshFileLoader.o

IRRMESHWRITER = CColladaMeshWriter.o CIrrMeshWriter.o CSTLMeshWriter.o COBJMeshWriter.o

IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \

CSkinnedMesh.o CBoneSceneNode.o CMeshSceneNode.o \

CAnimatedMeshSceneNode.o CAnimatedMeshMD2.o CAnimatedMeshMD3.o \

CQ3LevelMesh.o CQuake3ShaderSceneNode.o

IRROBJ = CBillboardSceneNode.o CCameraSceneNode.o CDummyTransformationSceneNode.o CEmptySceneNode.o CGeometryCreator.o CLightSceneNode.o CMeshManipulator.o CMetaTriangleSelector.o COctTreeSceneNode.o COctTreeTriangleSelector.o CSceneCollisionManager.o CSceneManager.o CShadowVolumeSceneNode.o CSkyBoxSceneNode.o CSkyDomeSceneNode.o CTerrainSceneNode.o CTerrainTriangleSelector.o CVolumeLightSceneNode.o CCubeSceneNode.o CSphereSceneNode.o CTextSceneNode.o CTriangleBBSelector.o CTriangleSelector.o CWaterSurfaceSceneNode.o CMeshCache.o CDefaultSceneNodeAnimatorFactory.o CDefaultSceneNodeFactory.o

IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.o CParticleBoxEmitter.o CParticleCylinderEmitter.o CParticleMeshEmitter.o CParticlePointEmitter.o CParticleRingEmitter.o CParticleSphereEmitter.o CParticleAttractionAffector.o CParticleFadeOutAffector.o CParticleGravityAffector.o CParticleRotationAffector.o CParticleSystemSceneNode.o CParticleScaleAffector.o

IRRANIMOBJ = CSceneNodeAnimatorCameraFPS.o CSceneNodeAnimatorCameraMaya.o CSceneNodeAnimatorCollisionResponse.o CSceneNodeAnimatorDelete.o CSceneNodeAnimatorFlyCircle.o CSceneNodeAnimatorFlyStraight.o CSceneNodeAnimatorFollowSpline.o CSceneNodeAnimatorRotation.o CSceneNodeAnimatorTexture.o

IRRDRVROBJ = CNullDriver.o COpenGLDriver.o COpenGLNormalMapRenderer.o COpenGLParallaxMapRenderer.o COpenGLShaderMaterialRenderer.o COpenGLTexture.o COpenGLSLMaterialRenderer.o COpenGLExtensionHandler.o CD3D8Driver.o CD3D8NormalMapRenderer.o CD3D8ParallaxMapRenderer.o CD3D8ShaderMaterialRenderer.o CD3D8Texture.o CD3D9Driver.o CD3D9HLSLMaterialRenderer.o CD3D9NormalMapRenderer.o CD3D9ParallaxMapRenderer.o CD3D9ShaderMaterialRenderer.o CD3D9Texture.o

IRRIMAGEOBJ = CColorConverter.o CImage.o CImageLoaderBMP.o CImageLoaderJPG.o CImageLoaderPCX.o CImageLoaderPNG.o CImageLoaderPSD.o CImageLoaderTGA.o CImageLoaderPPM.o CImageLoaderWAL.o \

CImageWriterBMP.o CImageWriterJPG.o CImageWriterPCX.o CImageWriterPNG.o CImageWriterPPM.o CImageWriterPSD.o CImageWriterTGA.o

IRRVIDEOOBJ = CVideoModeList.o CFPSCounter.o $(IRRDRVROBJ) $(IRRIMAGEOBJ)

IRRSWRENDEROBJ = CSoftwareDriver.o CSoftwareTexture.o CTRFlat.o CTRFlatWire.o CTRGouraud.o CTRGouraudWire.o CTRTextureFlat.o CTRTextureFlatWire.o CTRTextureGouraud.o CTRTextureGouraudAdd.o CTRTextureGouraudNoZ.o CTRTextureGouraudWire.o CZBuffer.o CTRTextureGouraudVertexAlpha2.o CTRTextureGouraudNoZ2.o CTRTextureLightMap2_M2.o CTRTextureLightMap2_M4.o CTRTextureLightMap2_M1.o CSoftwareDriver2.o CSoftwareTexture2.o CTRTextureGouraud2.o CTRGouraud2.o CTRGouraudAlpha2.o CTRGouraudAlphaNoZ2.o CTRTextureDetailMap2.o CTRTextureGouraudAdd2.o CTRTextureGouraudAddNoZ2.o CTRTextureWire2.o CTRTextureLightMap2_Add.o CTRTextureLightMapGouraud2_M4.o IBurningShader.o CTRTextureBlend.o CTRTextureGouraudAlpha.o CTRTextureGouraudAlphaNoZ.o CDepthBuffer.o CBurningShader_Raster_Reference.o

IRRIOOBJ = CFileList.o CFileSystem.o CLimitReadFile.o CMemoryReadFile.o CReadFile.o CWriteFile.o CXMLReader.o CXMLWriter.o CZipReader.o CPakReader.o irrXML.o CAttributes.o

IRROTHEROBJ = CIrrDeviceSDL.o CIrrDeviceLinux.o CIrrDeviceStub.o CIrrDeviceWin32.o CLogger.o COSOperator.o Irrlicht.o os.o

IRRGUIOBJ = CGUIButton.o CGUICheckBox.o CGUIComboBox.o CGUIContextMenu.o CGUIEditBox.o CGUIEnvironment.o CGUIFileOpenDialog.o CGUIFont.o CGUIImage.o CGUIInOutFader.o CGUIListBox.o CGUIMenu.o CGUIMeshViewer.o CGUIMessageBox.o CGUIModalScreen.o CGUIScrollBar.o CGUISpinBox.o CGUISkin.o CGUIStaticText.o CGUITabControl.o CGUITable.o CGUIToolBar.o CGUIWindow.o CGUIColorSelectDialog.o CDefaultGUIElementFactory.o CGUISpriteBank.o

ZLIBOBJ = zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/trees.o zlib/uncompr.o zlib/zutil.o

JPEGLIBOBJ = jpeglib/jcapimin.o jpeglib/jcapistd.o jpeglib/jccoefct.o jpeglib/jccolor.o jpeglib/jcdctmgr.o jpeglib/jchuff.o jpeglib/jcinit.o jpeglib/jcmainct.o jpeglib/jcmarker.o jpeglib/jcmaster.o jpeglib/jcomapi.o jpeglib/jcparam.o jpeglib/jcphuff.o jpeglib/jcprepct.o jpeglib/jcsample.o jpeglib/jctrans.o jpeglib/jdapimin.o jpeglib/jdapistd.o jpeglib/jdatadst.o jpeglib/jdatasrc.o jpeglib/jdcoefct.o jpeglib/jdcolor.o jpeglib/jddctmgr.o jpeglib/jdhuff.o jpeglib/jdinput.o jpeglib/jdmainct.o jpeglib/jdmarker.o jpeglib/jdmaster.o jpeglib/jdmerge.o jpeglib/jdphuff.o jpeglib/jdpostct.o jpeglib/jdsample.o jpeglib/jdtrans.o jpeglib/jerror.o jpeglib/jfdctflt.o jpeglib/jfdctfst.o jpeglib/jfdctint.o jpeglib/jidctflt.o jpeglib/jidctfst.o jpeglib/jidctint.o jpeglib/jidctred.o jpeglib/jmemmgr.o jpeglib/jmemnobs.o jpeglib/jquant1.o jpeglib/jquant2.o jpeglib/jutils.o

LIBPNGOBJ = libpng/png.o libpng/pngerror.o libpng/pngget.o libpng/pngmem.o libpng/pngpread.o libpng/pngread.o libpng/pngrio.o libpng/pngrtran.o libpng/pngrutil.o libpng/pngset.o libpng/pngtrans.o libpng/pngwio.o libpng/pngwrite.o libpng/pngwtran.o libpng/pngwutil.o
IRRPB = irrPB.o irrPB_Camera.o irrPB_CConeSceneNode.o irrPB_CConstructMeshSceneNode.o irrPB_EventReceiver.o irrPB_FileSystem.o irrPB_GUIFont.o irrPB_Light.o irrPB_LogFile.o irrPB_Material.o irrPB_Mesh.o irrPB_MeshManipulator.o irrPB_Node.o irrPB_Object.o irrPB_Texture.o

# Next variable is for additional scene nodes etc. of customized Irrlicht versions

EXTRAOBJ =

LINKOBJ = $(IRRMESHOBJ) $(IRROBJ) $(IRRPARTICLEOBJ) $(IRRANIMOBJ) \

$(IRRVIDEOOBJ) $(IRRSWRENDEROBJ) $(IRRIOOBJ) $(IRROTHEROBJ) \

$(IRRGUIOBJ) $(ZLIBOBJ) $(JPEGLIBOBJ) $(LIBPNGOBJ) $(EXTRAOBJ) $(IRRPB)



###############

#Compiler flags

CXXINCS = -I../../include -Izlib -Ijpeglib -Ilibpng

CPPFLAGS = $(CXXINCS) -DIRRLICHT_EXPORTS=1

CXXFLAGS = -Wall -pipe

ifndef NDEBUG

CXXFLAGS += -g -D_DEBUG

else

CXXFLAGS += -fexpensive-optimizations -O3

endif

ifdef PROFILE

CXXFLAGS += -pg

endif

CFLAGS := -fexpensive-optimizations -O3 -DPNG_THREAD_UNSAFE_OK -DPNG_NO_MMX_CODE -DPNG_NO_MNG_FEATURES



sharedlib sharedlib_osx: CXXFLAGS += -fpic

sharedlib sharedlib_osx: CFLAGS += -fpic



#multilib handling

ifeq ($(HOSTTYPE), x86_64)

LIBSELECT=64

endif



#Linux specific options

staticlib sharedlib install: SYSTEM = Linux

STATIC_LIB = libIrrlicht.a

IRRLICHT_DLL := ../../bin/Win32-gcc/Irrlicht.dll

LIB_PATH = ../../lib/$(SYSTEM)

INSTALL_DIR = /usr/local/lib

sharedlib: SHARED_LIB = libIrrlicht.so

staticlib sharedlib: LDFLAGS = --no-export-all-symbols --add-stdcall-alias

sharedlib: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lXxf86vm

staticlib sharedlib: CXXINCS += -I/usr/X11R6/include



#OSX specific options

staticlib_osx sharedlib_osx install_osx: SYSTEM = MacOSX

staticlib_osx sharedlib_osx: IRROTHEROBJ += MacOSX/CIrrDeviceMacOSX.o MacOSX/OSXClipboard.o MacOSX/AppDelegate.o

staticlib_osx sharedlib_osx: CXXINCS += -IMacOSX -I/usr/X11R6/include

sharedlib_osx: SHARED_LIB = libIrrlicht.dylib

staticlib_osx sharedlib_osx: LDFLAGS = --no-export-all-symbols --add-stdcall-alias

sharedlib_osx: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lXxf86vm



#Windows specific options

sharedlib_win32 staticlib_win32: SYSTEM = Win32-gcc

sharedlib_win32: LDFLAGS = -lgdi32 -lopengl32 -ld3dx9d -lwinmm

sharedlib_win32 staticlib_win32: CPPFLAGS += -DIRR_COMPILE_WITH_DX9_DEV_PACK -D__GNUWIN32__ -D_WIN32 -DWIN32 -D_WINDOWS -D_MBCS -D_USRDLL

staticlib_win32: CPPFLAGS += -D_IRR_STATIC_LIB_



####################

# All target, builds Irrlicht as static lib (libIrrlicht.a) and copies it into /lib/Linux

all linux: staticlib



# Builds Irrlicht as shared lib (libIrrlicht.so.versionNumber) and copies it into /lib/Linux

sharedlib: $(LINKOBJ)

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -shared -Wl,-soname,$(SHARED_LIB).1 -fPIC -o $(SHARED_LIB).$(VERSION) $^ $(LDFLAGS)

cp $(SHARED_LIB).$(VERSION) $(LIB_PATH)



# Builds Irrlicht as static lib (libIrrlicht.a)

$(STATIC_LIB): $(LINKOBJ)

$(AR) rs $@ $^



# Copies static lib into /lib/Linux

staticlib staticlib_osx: $(STATIC_LIB)

cp $^ $(LIB_PATH)



# Builds Irrlicht as dll (Irrlicht.dll) into ../../bin/Win32-gcc

all_win32 win32: sharedlib_win32

sharedlib_win32: $(IRRLICHT_DLL)

../../bin/Win32-gcc/Irrlicht.dll: $(LINKOBJ)

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -shared -o $@ $^ $(LDFLAGS) -Wl,--out-implib,../../lib/Win32-gcc/$(STATIC_LIB)

# Copies static lib into /lib/Win32-gcc

staticlib_win32: $(STATIC_LIB)

cp $^ $(LIB_PATH)



# Builds Irrlicht as shared lib (libIrrlicht.so.versionNumber) and copies it into /lib/Linux

sharedlib_osx: $(LINKOBJ)

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -dynamiclib -Wl,-install_name,$(SHARED_LIB).1 -fPIC -o $(SHARED_LIB).$(VERSION) $^ $(LDFLAGS)

cp $(SHARED_LIB).$(VERSION) $(LIB_PATH)



# Installs Irrlicht if it was created as shared lib

install:

cp $(LIB_PATH)/$(SHARED_LIB).$(VERSION) $(INSTALL_DIR)

cd $(INSTALL_DIR) && ln -s libIrrlicht.so.$(VERSION) $(SHARED_LIB)

ldconfig -n $(INSTALL_DIR)



install_osx:

cp $(LIB_PATH)/$(SHARED_LIB).$(VERSION) $(INSTALL_DIR)

cd $(INSTALL_DIR) && ln -s libIrrlicht.dylib.$(VERSION) $(SHARED_LIB)

ldconfig -n $(INSTALL_DIR)



TAGS:

ctags *.cpp ../../include/*.h *.h



# Create dependency files for automatic recompilation

%.d:%.cpp

$(CXX) $(CPPFLAGS) -MM -MF $@ $<



# Create object files from objective-c code

%.o:%.mm

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<



ifneq ($(MAKECMDGOALS),clean)

-include $(LINKOBJ:.o=.d)

endif



help:

@echo "Available targets for Irrlicht"

@echo " sharedlib: Build shared library Irrlicht.so for Linux"

@echo " staticlib: Build static library Irrlicht.a for Linux"

@echo " install: Copy shared library to /usr/lib"

@echo ""

@echo " sharedlib_win32: Build shared library Irrlicht.dll for Windows"

@echo " staticlib_win32: Build static library Irrlicht.a for Windows"

@echo ""

@echo " clean: Clean up directory"



# Cleans all temporary files and compilation results.

clean:

$(RM) $(LINKOBJ) $(SHARED_LIB).$(VERSION) $(STATIC_LIB) $(LINKOBJ:.o=.d)



.PHONY: all sharedlib staticlib sharedlib_win32 staticlib_win32 help install clean

A la racine de EngineSource , faut créer le répertoire lib/Linux/


Puis la compilation :
make && make sharedlib
Dans le repertoire , copié la lib statique dans les userlib de purebasic
la dynamique dans usr/lib


dans IrrPB.pbi

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS = #PB_OS_Linux

	; Link OpenGL
	ImportC "-lGL"
	EndImport
	
	; Link Xf86
	ImportC "-lXxf86vm"
	EndImport
	
	; Link X11
	ImportC "-lX11"
	EndImport

	ImportC "-lIrrlicht"
CompilerEndIf  

dans medias :

mettre CourrierNew.png par courriernew.png

puis lancer l'exemple 1
Commenté la création de cylindre
bien mettre en lower case "courriernew"

logiquement ca marche.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

..
Dernière modification par flaith le sam. 04/avr./2009 16:54, modifié 2 fois.
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 »

Merci beaucoup. La bonne nouvelle c'est qu'a part deux trois truc à régler, cela devrait le faire sous Linux,
et cela est très important .

Je vais étudier ton post, et essayer de corriger et comprendre, ainsi que mettre à jour
les différentes archive avant ce soir. Merci.
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

et un petit exemple de plus :)

Code : Tout sélectionner

; ------------------------------------------------------------
;   irrPB exemples
;
;   Sample 014  : 200 cubes.
;   Historique  :
;     29/03/09  19:16    Dobro
;
; ------------------------------------------------------------



; Include files 
IncludePath "Includes\"   :   IncludeFile "irrPB.pbi"



; Globales
Global	anglex.f, angley.f, flagXDown.w
Global	mox.f, omx.f, moy.l, omy.l

Global *app.l, Quit.l


;----------------------------------------------------------
; open irrPB screen
*app = iCreateGraphics3D(800,600,32,#False, #False)
; << OR >>
;iCreateGraphics3D(800,600, 32, #False, #True, #EDT_DIRECT3D9)
If *app= #Null
    End
EndIf


 
;----------------------------------------
; create light and set position
*light.ILight = iCreateLight()
iPositionNode(*light, 0,15,-8)
; change light type -> SPOTLIGHT 
iTypeLight( *light, #ELT_DIRECTIONAL)
 
 
;----------------------------------------
Dim tableau(71,16)
InitSprite()
CreateImage(1,70,15)
StartDrawing(ImageOutput(1))
    DrawText(0, 0, "Pure Basic") 
    For y=0 To 15
        For x=0 To 70 
            tableau(x,y) = Point(x, y)
        Next x
    Next y 
StopDrawing()



; create a cube and set position

For y=0 To 15
    For x=0 To 70
        If tableau(x,y)=0
            *cube.IMesh = iCreateCube(1.0)   
            iPositionNode(*cube, x-20,-y+50 ,-0) 
            iDiffuseColorNode(*cube, $FF000000+Random($FFFFFF))
        EndIf
    Next x
Next y




; create a camera
Define *cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,40,-35)
iRotateNode(*cam, 20,0,0)



Global *font.IGUIFont = iGetFont()




; ---------------------------------------
;           main loop
; ---------------------------------------
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 Escape Key, exit	
    If iGetKeyDown(#KEY_ESCAPE)
        Quit=1
    EndIf
    
    
  	; ---------------
  	;      Render
  	; ---------------
    iBeginScene()
    iDrawScene()
    iDrawText(*font, "200 cubes. fps: "+Str(iFPS()),  10,10,0,0)
    iEndScene()
    
    
    
Until Quit=1
; end
iFreeEngine()
Anonyme

Message par Anonyme »

j'oubliais.

HWD n'existe pas non plus , j'ai remplacer par int * , par contre , je ne sais plus c'est quel fichier.


ps: Pense aussi que sous Linux , c'est sensible à la case ( pour les exemple , il tourne tous , sauf les spécifique a windows.)
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 »

Dobro a écrit :et un petit exemple de plus :)
excellent, il prendra la place de celui d'origine (sample010) :D
Cpl.Bator a écrit :j'oubliais.

HWD n'existe pas non plus , j'ai remplacer par int * , par contre , je ne sais plus c'est quel fichier.


ps: Pense aussi que sous Linux , c'est sensible à la case ( pour les exemple , il tourne tous , sauf les spécifique a windows.)
Oui, pour HWND je vais corriger, ou définir une constante pour Nunux. Quand à la case, effectivement, j'avais oublié. Je vais donc
faire attention.
Pour ce qui est des exemples, l'extension windows ou linux dans le nom sera là pour bien attirer l'attention des éventuels
testeurs.
Cpl.Bator a écrit :
irrPB_mesh.cpp

ligne 119 :

Code : Tout sélectionner

scene::IMeshSceneNode* node = NULL;// new scene::CCylinderSceneNode(radius, length, tesselation, colorT, closeTop, oblique, parent, globenv.smgr, -1);
si je ne commente pas , j'ai un "indefined reference" , je ne suis pas rentré dans les détails
Bizarre cela par contre. D'autant que pour la creation d'un cone, la fonction iCreateCone est quasiment le calque de
iCreateCylinder, et ne semble pas t'avoir embêté lors de la compil pour ce qui la concerne, non ?
Force et sagesse...
Anonyme

Message par Anonyme »

pas de problème avec le cone , mais pour le cylindre , à la compilation PB
j'ai un message du compilo :
Undefined Reference "scene::CCylinderSceneNode"
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 »

Genre de bug que j'aime pas. Mais je vais bien arriver à trouver l'origine du souci.
Bizarre que PB te fournisse une erreur lié au code interne de irrPB (qui en est C++).
Comment cela se fait ?
Force et sagesse...
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

j'ai testé sur mon brontosaure, et çà tourne sans soucis avec une préhistorique radeon 700 sdr :)
Répondre