python-ogre-commit Mailing List for Ogre3d Python bindings (Python-Ogre) (Page 29)
Brought to you by:
andy_miller,
roman_yakovenko
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(3) |
Sep
(30) |
Oct
(60) |
Nov
(17) |
Dec
(47) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(33) |
Feb
(18) |
Mar
(3) |
Apr
(5) |
May
(6) |
Jun
(34) |
Jul
(54) |
Aug
(33) |
Sep
(36) |
Oct
(33) |
Nov
(40) |
Dec
(6) |
2009 |
Jan
(37) |
Feb
(38) |
Mar
(31) |
Apr
(23) |
May
(24) |
Jun
(2) |
Jul
(6) |
Aug
(5) |
Sep
(1) |
Oct
(14) |
Nov
(12) |
Dec
(26) |
2010 |
Jan
(23) |
Feb
(17) |
Mar
(17) |
Apr
(2) |
May
(10) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
(2) |
2011 |
Jan
(4) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(4) |
Nov
|
Dec
|
From: <and...@us...> - 2007-10-17 07:07:42
|
Revision: 430 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=430&view=rev Author: andy_miller Date: 2007-10-17 00:07:35 -0700 (Wed, 17 Oct 2007) Log Message: ----------- Removed duplicated file Removed Paths: ------------- trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPreRequisites.h Deleted: trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPreRequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPreRequisites.h 2007-10-16 23:51:47 UTC (rev 429) +++ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPreRequisites.h 2007-10-17 07:07:35 UTC (rev 430) @@ -1,89 +0,0 @@ -/*************************************************************************** - -This source file is part of OGREBULLET -(Object-oriented Graphics Rendering Engine Bullet Wrapper) -For the latest info, see http://www.ogre3d.org/phpBB2addons/viewforum.php?f=10 - -Copyright (c) 2007 tua...@gm... - - - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place - Suite 330, Boston, MA 02111-1307, USA, or go to -http://www.gnu.org/copyleft/lesser.txt. ------------------------------------------------------------------------------ -*/ - -#ifndef _OGREBULLETCOLLISIONS_PREREQUISITES_H -#define _OGREBULLETCOLLISIONS_PREREQUISITES_H - -#include "btBulletCollisionCommon.h" - -#include "Ogre.h" - -/* Some <math.h> files do not define M_PI... */ -#ifndef M_PI -#define M_PI 3.14159265 -#endif - -namespace OgreBulletCollisions -{ - class BtOgreConverter; - class OgreBtConverter; - - class CollisionsWorld; - - class CollisionRayResultCallback; - class CollisionClosestRayResultCallback; - - class DebugLines; - - class DebugDrawer; - - class DebugContact; - class DebugNormal; - class DebugContactText; - - class DebugCollisionShape; - class BoxDebugShape; - class SphereDebugShape; - class ConeDebugShape; - class TriangleMeshDebugShape; - class RayDebugShape; - - class CollisionShape; - class BoxCollisionShape; - class SphereCollisionShape; - class CylinderCollisionShape; - class ConeCollisionShape; - - class CompoundCollisionShape; - - class MultiSphereCollisionShape; - class MinkowskiSumCollisionShape; - - class ConvexHullCollisionShape; - class TriangleMeshCollisionShape; - - class Object; - - class ObjectState; - - typedef std::vector<Ogre::Vector3> Vector3Vector; - typedef std::map<unsigned char, Vector3Vector* > BoneIndex; - typedef std::pair<unsigned short, Vector3Vector* > BoneKeyIndex; - -} - -#endif //_OGREBULLETCOLLISIONS_PREREQUISITES_H - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-16 23:51:44
|
Revision: 429 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=429&view=rev Author: andy_miller Date: 2007-10-16 16:51:47 -0700 (Tue, 16 Oct 2007) Log Message: ----------- Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_posix.py trunk/python-ogre/ThirdParty/betagui/BetaGUI.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintTerrain.h trunk/python-ogre/code_generators/nxogre/generate_code.py trunk/python-ogre/code_generators/nxogre/python_nxogre.h trunk/python-ogre/code_generators/nxogre/python_nxogre_aliases.h trunk/python-ogre/code_generators/nxogre/python_nxogre_sizeof.h trunk/python-ogre/environment.py Added Paths: ----------- trunk/python-ogre/code_generators/physx/ trunk/python-ogre/code_generators/physx/1 trunk/python-ogre/code_generators/physx/build.out trunk/python-ogre/code_generators/physx/customization_data.py trunk/python-ogre/code_generators/physx/customization_data.pyc trunk/python-ogre/code_generators/physx/generate_code.py trunk/python-ogre/code_generators/physx/hand_made_wrappers.py trunk/python-ogre/code_generators/physx/hand_made_wrappers.pyc trunk/python-ogre/code_generators/physx/python_physx.h trunk/python-ogre/code_generators/physx/python_physx_aliases.h trunk/python-ogre/code_generators/physx/python_physx_sizeof.h Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-16 14:42:49 UTC (rev 428) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-16 23:51:47 UTC (rev 429) @@ -135,11 +135,12 @@ ,os.path.join(PATH_OgreAddons,'videoplugin','theora','include') ,os.path.join(PATH_OgreAddons,'videoplugin','ptypes-1.8.3','include') ] -physxbase = os.path.join(LOCAL_INCLUDE, 'PhysX','v2.7.2') +physxbase = os.path.join(LOCAL_INCLUDE, 'PhysX','v2.7.2', 'SDKs') PATH_INCLUDE_PhysX= [ physxbase - ,os.path.join(physxbase, 'Cooking','include') + ,os.path.join(physxbase, 'Cooking','Include') ,os.path.join(physxbase, 'Foundation','include') ,os.path.join(physxbase, 'PhysXLoader','include') ,os.path.join(physxbase, 'NxCharacter','include') ,os.path.join(physxbase, 'NxExtensions','include') + ,os.path.join(physxbase, 'Physics','include') ] Modified: trunk/python-ogre/ThirdParty/betagui/BetaGUI.h =================================================================== --- trunk/python-ogre/ThirdParty/betagui/BetaGUI.h 2007-10-16 14:42:49 UTC (rev 428) +++ trunk/python-ogre/ThirdParty/betagui/BetaGUI.h 2007-10-16 23:51:47 UTC (rev 429) @@ -282,7 +282,7 @@ MenuButton* createMenuButton(const Ogre::Vector4 &D, const Ogre::String &M, const Ogre::String &T, Callback C, Window *t); BoolButton* createBoolButton(const Ogre::Vector4 &D, const Ogre::String &M, const Ogre::String &T, Callback C, bool boolValue); - RealButton *Window::createRealButton(Ogre::Real value, + RealButton *createRealButton(Ogre::Real value, const Ogre::Vector4 &SliderMoves, const Ogre::String &label, const Ogre::Vector2 &pos); Modified: trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintTerrain.h =================================================================== --- trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintTerrain.h 2007-10-16 14:42:49 UTC (rev 428) +++ trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintTerrain.h 2007-10-16 23:51:47 UTC (rev 429) @@ -53,4 +53,5 @@ }; -#endif \ No newline at end of file +#endif + Modified: trunk/python-ogre/code_generators/nxogre/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/nxogre/generate_code.py 2007-10-16 14:42:49 UTC (rev 428) +++ trunk/python-ogre/code_generators/nxogre/generate_code.py 2007-10-16 23:51:47 UTC (rev 429) @@ -166,7 +166,10 @@ ] for e in excludes: print "excluding ", e - main_ns.member_functions(e).exclude() + try: + main_ns.member_functions(e).exclude() + except: + pass ## this is probably excessive :) names = ['_begin','_end', '_atEnd', '_next'] @@ -197,6 +200,20 @@ ] for e in excludes: main_ns.class_(e).exclude() + +# if os.name != 'nt': +# ## Classes +# excludes = ['::NxOgre::FluidDrains' +# ,'::NxOgre::FluidEmitters' +# ,'::NxOgre::FluidMesh' +# ,'::NxOgre::FluidParams' +# ,'::NxOgre::Fluids' +# +# # not yet implemented in source +# ] +# for e in excludes: +# main_ns.class_(e).exclude() + # # # # # # ## I have a challenge that Py++ doesn't recognise these classes by full name (perhaps because they are structs?) @@ -235,8 +252,11 @@ ### Operators excludes=['::NxOgre::Container<std::string, NxOgre::FluidDrain*>::operator[]' ,'::NxOgre::Container<std::string, NxOgre::FluidEmitter*>::operator[]'] - for e in excludes: - main_ns.operators(e).exclude() + for e in excludes: + try: + main_ns.operators(e).exclude() + except: + pass ### Constructors for c in main_ns.class_('::NxOgre::Pose').constructors(): ## these hide the working constructors @@ -617,7 +637,11 @@ os.path.join( environment.nxogre.root_dir, "python_nxogre.h" ) , environment.nxogre.cache_file ) - defined_symbols = [ 'NXOGRE_EXPORTS','OGRE_NONCLIENT_BUILD', 'OGRE_GCC_VISIBILITY'] + if os.name == 'nt': + defined_symbols = [ 'NXOGRE_EXPORTS','OGRE_NONCLIENT_BUILD', 'OGRE_GCC_VISIBILITY'] + else: + defined_symbols = [ 'LINUX','NX_LINUX', 'NX_DISABLE_FLUIDS', 'OGRE_NONCLIENT_BUILD', 'OGRE_GCC_VISIBILITY'] + if environment._USE_THREADS: defined_symbols.append('BOOST_HAS_THREADS') defined_symbols.append('BOOST_HAS_WINTHREADS') Modified: trunk/python-ogre/code_generators/nxogre/python_nxogre.h =================================================================== --- trunk/python-ogre/code_generators/nxogre/python_nxogre.h 2007-10-16 14:42:49 UTC (rev 428) +++ trunk/python-ogre/code_generators/nxogre/python_nxogre.h 2007-10-16 23:51:47 UTC (rev 429) @@ -1,6 +1,6 @@ #include "NxOgre.h" -#include "NXOgreSkeleton.h" //missing ?? +#include "NxOgreSkeleton.h" //missing ?? #include "Ogre.h" #include "OgrePlugin.h" #include <NxPhysics.h> Modified: trunk/python-ogre/code_generators/nxogre/python_nxogre_aliases.h =================================================================== --- trunk/python-ogre/code_generators/nxogre/python_nxogre_aliases.h 2007-10-16 14:42:49 UTC (rev 428) +++ trunk/python-ogre/code_generators/nxogre/python_nxogre_aliases.h 2007-10-16 23:51:47 UTC (rev 429) @@ -43,12 +43,12 @@ MapContainerMaterial; typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::Character*>::Containee, std::less<std::string> >\ MapContainerCharacter; -typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::Fluid*>::Containee, std::less<std::string> >\ - MapContainerFluid; -typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::FluidDrain*>::Containee, std::less<std::string> >\ - MapContainerFluidDrain; -typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::FluidEmitter*>::Containee, std::less<std::string> >\ - MapContainerFluidEmitter; +//typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::Fluid*>::Containee, std::less<std::string> >\ +// MapContainerFluid; +//typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::FluidDrain*>::Containee, std::less<std::string> >\ +// MapContainerFluidDrain; +//typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::FluidEmitter*>::Containee, std::less<std::string> >\ +// MapContainerFluidEmitter; typedef std::map<std::string, NxOgre::Container<std::string, NxOgre::SoftBody*>::Containee, std::less<std::string> >\ MapContainerSoftBody; @@ -92,9 +92,9 @@ typedef NxOgre::List<NxOgre::Wheel*> Wheels; typedef NxOgre::Container<NxOgre::NxString, NxOgre::Character*> Characters; typedef NxOgre::List<NxOgre::CharacterHitReport*> CharacterHitReports; -typedef NxOgre::Container<NxOgre::NxString, NxOgre::Fluid*> Fluids; -typedef NxOgre::Container<NxOgre::NxString, NxOgre::FluidDrain*> FluidDrains; -typedef NxOgre::Container<NxOgre::NxString, NxOgre::FluidEmitter*> FluidEmitters; +//typedef NxOgre::Container<NxOgre::NxString, NxOgre::Fluid*> Fluids; +//typedef NxOgre::Container<NxOgre::NxString, NxOgre::FluidDrain*> FluidDrains; +//typedef NxOgre::Container<NxOgre::NxString, NxOgre::FluidEmitter*> FluidEmitters; typedef NxOgre::Container<NxOgre::NxString, NxOgre::SoftBody*> SoftBodies; typedef std::pair<NxOgre::NxString,NxOgre::NxString> Parameter; typedef std::vector<Parameter> Parameters; @@ -128,4 +128,4 @@ typedef std::map<unsigned, NxOgre::Container<unsigned, NxOgre::Joint*>::Containee, std::less<unsigned>, std::allocator<std::pair<unsigned const, NxOgre::Container<unsigned, NxOgre::Joint*>::Containee> > >\ MapContainerJointContainee; typedef std::map<unsigned short, NxOgre::Container<unsigned short, NxOgre::DominanceGroup*>::Containee, std::less<unsigned short>, std::allocator<std::pair<unsigned short const, NxOgre::Container<unsigned short, NxOgre::DominanceGroup*>::Containee> > >\ - MapContainerDominanceGroupContainee; \ No newline at end of file + MapContainerDominanceGroupContainee; Modified: trunk/python-ogre/code_generators/nxogre/python_nxogre_sizeof.h =================================================================== --- trunk/python-ogre/code_generators/nxogre/python_nxogre_sizeof.h 2007-10-16 14:42:49 UTC (rev 428) +++ trunk/python-ogre/code_generators/nxogre/python_nxogre_sizeof.h 2007-10-16 23:51:47 UTC (rev 429) @@ -15,7 +15,7 @@ sizeof ( NxClothMesh ); sizeof ( NxConvexShapeDesc ); sizeof ( NxMeshData ); -sizeof ( NxFluid ); +//sizeof ( NxFluid ); sizeof ( NxHeightFieldAxis ); sizeof ( NxTriangleMeshShapeDesc ); sizeof ( NxTriangleMesh ); @@ -27,7 +27,7 @@ sizeof ( NxHeightField ); sizeof ( NxUserContactReport ); //sizeof ( NxOgre::FluidDrain ); -sizeof ( NxImplicitScreenMesh ); +//sizeof ( NxImplicitScreenMesh ); sizeof ( NxMemoryType ); sizeof ( NxJointState ); sizeof ( NxBounds3 ); Added: trunk/python-ogre/code_generators/physx/1 =================================================================== Added: trunk/python-ogre/code_generators/physx/build.out =================================================================== --- trunk/python-ogre/code_generators/physx/build.out (rev 0) +++ trunk/python-ogre/code_generators/physx/build.out 2007-10-16 23:51:47 UTC (rev 429) @@ -0,0 +1,495 @@ +WARNING: Unable to find ode/ode.h include file (ode class) in include_dirs +WARNING: Unable to find ode/ode.h include file (ogrerefapp class) in include_dirs +WARNING: Unable to find ode/ode.h include file (ogreode class) in include_dirs +WARNING: Unable to find ode/odecpp.h include file (ogreode class) in include_dirs +WARNING: Unable to find Ogreode_Prefab.h include file (ogreode class) in include_dirs + +INFO Parsing xml file "/home/andy/development/python-ogre/code_generators/cache/physx_2.7.2_cache.xml" ... +Excluding static const NX_NO_HIGH_LIMIT [variable] +Excluding static const NX_NO_LOW_LIMIT [variable] +Excluding static const NxInvPiF32 [variable] +Excluding static const NxTwoPiF32 [variable] +Excluding static const NxHalfPiF32 [variable] +Excluding static const NxPiF32 [variable] +Excluding static const NxInvPiF64 [variable] +Excluding static const NxTwoPiF64 [variable] +Excluding static const NxHalfPiF64 [variable] +Excluding static const NxPiF64 [variable] +excluded NxForceFieldShapeDesc::type [variable] protected +excluded NxContactStreamIterator::pointNormalForce [variable] protected +excluded NxContactStreamIterator::stream [variable] protected +excluded NxContactStreamIterator::numPairs [variable] private +excluded NxContactStreamIterator::shapes [variable] private +excluded NxContactStreamIterator::shapeFlags [variable] private +excluded NxContactStreamIterator::numPatches [variable] private +excluded NxContactStreamIterator::patchNormal [variable] private +excluded NxContactStreamIterator::numPoints [variable] private +excluded NxContactStreamIterator::point [variable] private +excluded NxContactStreamIterator::separation [variable] private +excluded NxContactStreamIterator::featureIndex0 [variable] private +excluded NxContactStreamIterator::featureIndex1 [variable] private +excluded NxContactStreamIterator::numPairsRemaining [variable] private +excluded NxContactStreamIterator::numPatchesRemaining [variable] private +excluded NxContactStreamIterator::numPointsRemaining [variable] private +excluded NxShapeDesc::type [variable] protected +excluded NxEffectorDesc::type [variable] protected +excluded NxJointDesc::type [variable] protected +excluded NxActorDescBase::type [variable] protected +excluded NxFluidDescBase::type [variable] protected +excluded NxMat33::data [variable] private +excluded NxBitField::FlagRef::bitField [variable] private +excluded NxBitField::FlagRef::bitIndex [variable] private +excluded NxBitField::FlagRef::bitField [variable] private +excluded NxBitField::FlagRef::bitIndex [variable] private +excluded NxArray<NxFluidEmitterDesc, NxAllocatorDefault>::first [variable] private +excluded NxArray<NxFluidEmitterDesc, NxAllocatorDefault>::last [variable] private +excluded NxArray<NxFluidEmitterDesc, NxAllocatorDefault>::memEnd [variable] private +excluded NxArray<NxFluidEmitterDesc, NxAllocatorDefault>::allocator [variable] private +excluded NxArray<NxShapeDesc*, NxAllocatorDefault>::first [variable] private +excluded NxArray<NxShapeDesc*, NxAllocatorDefault>::last [variable] private +excluded NxArray<NxShapeDesc*, NxAllocatorDefault>::memEnd [variable] private +excluded NxArray<NxShapeDesc*, NxAllocatorDefault>::allocator [variable] private +excluded NxDebugRenderable::numPoints [variable] private +excluded NxDebugRenderable::numLines [variable] private +excluded NxDebugRenderable::numTriangles [variable] private +excluded NxDebugRenderable::points [variable] private +excluded NxDebugRenderable::lines [variable] private +excluded NxDebugRenderable::triangles [variable] private +excluding function ::NxArray<NxShapeDesc*, NxAllocatorDefault>::begin +excluding function ::NxArray<NxFluidEmitterDesc, NxAllocatorDefault>::deleteEntry +excluding function ::NxArray<NxShapeDesc*, NxAllocatorDefault>::end +excluding function ::NxCookingInterface::NxCreatePMap +excluding function ::NxForceField::releaseShape +excluding function ::NxUtilLib::NxGetBoxEdgesAxes +excluding function ::NxImplicitScreenMesh::getProjectionMatrix +excluding function ::NxVec3::get +excluding function ::NxBitField::rangeToDenseMask +excluding function ::NxBitField::maskToShift +Excluding: NxReal const * NxVec3::get() const [member function] +Excluding Operator: NxReal & NxMat33::operator()(int row, int col) [member operator] +CHECK NxU32 NxUtilLib::NxRayCapsuleIntersect(NxVec3 const & origin, NxVec3 const & dir, NxCapsule const & capsule, NxReal * t) [member function] 3 +CHECK bool NxUtilLib::NxBuildSmoothNormals(NxU32 nbTris, NxU32 nbVerts, NxVec3 const * verts, unsigned int const * dFaces, NxU16 const * wFaces, NxVec3 * normals, bool flip=false) [member function] 3 +CHECK void NxImplicitScreenMesh::setProjectionMatrix(NxReal const * projection44) [member function] 0 +CHECK bool NxJoint::getNextLimitPlane(NxVec3 & planeNormal, NxReal & planeD, NxReal * restitution=0) [member function] 2 +CHECK void NxQuat::setWXYZ(NxReal const * d) [member function] 0 +CHECK void NxQuat::setXYZW(NxReal const * d) [member function] 0 +CHECK static NxU32 NxMath::hash(unsigned int const * k, NxU32 length) [member function] 0 +Excluding: NxVec3::NxVec3(NxReal const * v) [constructor] +Excluding: NxDebugRenderable::NxDebugRenderable(NxU32 np, NxDebugPoint const * p, NxU32 nl, NxDebugLine const * l, NxU32 nt, NxDebugTriangle const * t) [constructor] +Excluding (function): unsigned int const * NxUtilLib::NxGetBoxEdges() [member function] as it returns (pointer) unsigned int +Excluding (function): unsigned int const * NxUtilLib::NxGetBoxTriangles() [member function] as it returns (pointer) unsigned int +Excluding (function): unsigned int const * NxUtilLib::NxGetBoxQuads() [member function] as it returns (pointer) unsigned int +Excluding (function): unsigned int const * NxUtilLib::NxBoxVertexToQuad(NxU32 vertexIndex) [member function] as it returns (pointer) unsigned int +Wrapped: NxFluidEmitter * * NxFluid::getEmitters() const [member function] +Wrapped: NxImplicitScreenMesh * * NxFluid::getScreenSurfaceMeshes() const [member function] +Wrapped: NxClothMesh * * NxPhysicsSDK::getClothMeshes() [member function] +Wrapped: NxSoftBodyMesh * * NxPhysicsSDK::getSoftBodyMeshes() [member function] +Wrapped: NxShape * const * NxActor::getShapes() const [member function] +Wrapped: NxForceField * * NxScene::getForceFields() [member function] +Wrapped: NxActor * * NxScene::getActors() [member function] +Wrapped: NxFluid * * NxScene::getFluids() [member function] +Wrapped: NxImplicitScreenMesh * * NxScene::getImplicitScreenMeshes() [member function] +Wrapped: NxCloth * * NxScene::getCloths() [member function] +Wrapped: NxSoftBody * * NxScene::getSoftBodies() [member function] +Excluded: NxShapeDesc * * NxArray<NxShapeDesc*, NxAllocatorDefault>::begin() [member function] +Excluded: NxShapeDesc * const * NxArray<NxShapeDesc*, NxAllocatorDefault>::begin() const [member function] +Excluded: NxShapeDesc * * NxArray<NxShapeDesc*, NxAllocatorDefault>::end() [member function] +Excluded: NxShapeDesc * const * NxArray<NxShapeDesc*, NxAllocatorDefault>::end() const [member function] +Excluded: NxShapeDesc * * NxArray<NxShapeDesc*, NxAllocatorDefault>::copy(NxShapeDesc * const * f, NxShapeDesc * const * l, NxShapeDesc * * p) [member function] +Excluded: NxShapeDesc * * NxArray<NxShapeDesc*, NxAllocatorDefault>::allocate(size_t n) [member function] +Excluded: NxShapeDesc * * NxArray<NxShapeDesc*, NxAllocatorDefault>::reallocate(size_t n, NxShapeDesc * * old) [member function] + +WARNING: void NxUtilLib::NxSegmentPlaneIntersect(NxVec3 const & v1, NxVec3 const & v2, NxPlane const & plane, NxReal & dist, NxVec3 & pointOnPlane) [member function] +> execution error W1009: The function takes as argument (name=dist, pos=3) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUtilLib::NxRayPlaneIntersect(NxRay const & ray, NxPlane const & plane, NxReal & dist, NxVec3 & pointOnPlane) [member function] +> execution error W1009: The function takes as argument (name=dist, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUtilLib::NxRaySphereIntersect(NxVec3 const & origin, NxVec3 const & dir, NxReal length, NxVec3 const & center, NxReal radius, NxReal & hit_time, NxVec3 & hit_pos) [member function] +> execution error W1009: The function takes as argument (name=hit_time, pos=5) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxUtilLib::NxRayAABBIntersect2(NxVec3 const & min, NxVec3 const & max, NxVec3 const & origin, NxVec3 const & dir, NxVec3 & coord, NxReal & t) [member function] +> execution error W1009: The function takes as argument (name=t, pos=5) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUtilLib::NxRayTriIntersect(NxVec3 const & orig, NxVec3 const & dir, NxVec3 const & vert0, NxVec3 const & vert1, NxVec3 const & vert2, float & t, float & u, float & v, bool cull) [member function] +> execution error W1009: The function takes as argument (name=t, pos=5) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUtilLib::NxRayTriIntersect(NxVec3 const & orig, NxVec3 const & dir, NxVec3 const & vert0, NxVec3 const & vert1, NxVec3 const & vert2, float & t, float & u, float & v, bool cull) [member function] +> execution error W1009: The function takes as argument (name=u, pos=6) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUtilLib::NxRayTriIntersect(NxVec3 const & orig, NxVec3 const & dir, NxVec3 const & vert0, NxVec3 const & vert1, NxVec3 const & vert2, float & t, float & u, float & v, bool cull) [member function] +> execution error W1009: The function takes as argument (name=v, pos=7) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUserWheelContactModify::onWheelContact(NxWheelShape * wheelShape, NxVec3 & contactPoint, NxVec3 & contactNormal, NxReal & contactPosition, NxReal & normalForce, NxShape * otherShape, NxMaterialIndex & otherShapeMaterialIndex, NxU32 otherShapeFeatureIndex) [member function] +> execution error W1009: The function takes as argument (name=contactPosition, pos=3) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUserWheelContactModify::onWheelContact(NxWheelShape * wheelShape, NxVec3 & contactPoint, NxVec3 & contactNormal, NxReal & contactPosition, NxReal & normalForce, NxShape * otherShape, NxMaterialIndex & otherShapeMaterialIndex, NxU32 otherShapeFeatureIndex) [member function] +> execution error W1009: The function takes as argument (name=normalForce, pos=4) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxUserWheelContactModify::onWheelContact(NxWheelShape * wheelShape, NxVec3 & contactPoint, NxVec3 & contactNormal, NxReal & contactPosition, NxReal & normalForce, NxShape * otherShape, NxMaterialIndex & otherShapeMaterialIndex, NxU32 otherShapeFeatureIndex) [member function] +> execution error W1009: The function takes as argument (name=otherShapeMaterialIndex, pos=6) non-const reference to Python +> immutable type - function could not be called from Python. Take a look on "Function Transformation" functionality and +> define the transformation. + +WARNING: NxCompartmentType [enumeration] +> execution error W1032: Boost.Python library does not support enums with duplicate values. You can read more about this +> here: http://boost.org/libs/python/todo.html#support-for-enums-with-duplicate-values . The quick work around is to add new +> class variable to the exported enum, from Python. + +WARNING: NxSimulationStatus [enumeration] +> execution error W1032: Boost.Python library does not support enums with duplicate values. You can read more about this +> here: http://boost.org/libs/python/todo.html#support-for-enums-with-duplicate-values . The quick work around is to add new +> class variable to the exported enum, from Python. + +WARNING: void NxSpringAndDamperEffector::getLinearSpring(NxReal & distCompressSaturate, NxReal & distRelaxed, NxReal & distStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=distCompressSaturate, pos=0) non-const reference to Python +> immutable type - function could not be called from Python. Take a look on "Function Transformation" functionality and +> define the transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearSpring(NxReal & distCompressSaturate, NxReal & distRelaxed, NxReal & distStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=distRelaxed, pos=1) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearSpring(NxReal & distCompressSaturate, NxReal & distRelaxed, NxReal & distStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=distStretchSaturate, pos=2) non-const reference to Python +> immutable type - function could not be called from Python. Take a look on "Function Transformation" functionality and +> define the transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearSpring(NxReal & distCompressSaturate, NxReal & distRelaxed, NxReal & distStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=maxCompressForce, pos=3) non-const reference to Python +> immutable type - function could not be called from Python. Take a look on "Function Transformation" functionality and +> define the transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearSpring(NxReal & distCompressSaturate, NxReal & distRelaxed, NxReal & distStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=maxStretchForce, pos=4) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearDamper(NxReal & velCompressSaturate, NxReal & velStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=velCompressSaturate, pos=0) non-const reference to Python +> immutable type - function could not be called from Python. Take a look on "Function Transformation" functionality and +> define the transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearDamper(NxReal & velCompressSaturate, NxReal & velStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=velStretchSaturate, pos=1) non-const reference to Python +> immutable type - function could not be called from Python. Take a look on "Function Transformation" functionality and +> define the transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearDamper(NxReal & velCompressSaturate, NxReal & velStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=maxCompressForce, pos=2) non-const reference to Python +> immutable type - function could not be called from Python. Take a look on "Function Transformation" functionality and +> define the transformation. + +WARNING: void NxSpringAndDamperEffector::getLinearDamper(NxReal & velCompressSaturate, NxReal & velStretchSaturate, NxReal & maxCompressForce, NxReal & maxStretchForce) [member function] +> execution error W1009: The function takes as argument (name=maxStretchForce, pos=3) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxSoftBody::raycast(NxRay const & worldRay, NxVec3 & hit, NxU32 & vertexId) [member function] +> execution error W1009: The function takes as argument (name=vertexId, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxSoftBody::getShapePointers(NxShape * * shapePointers, NxU32 * flags) [member function] +> warning W1051: The function takes as argument (name=shapePointers, pos=0) "NxShape * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: void NxSoftBody::setShapePointers(NxShape * * shapePointers, unsigned int numShapes) [member function] +> warning W1051: The function takes as argument (name=shapePointers, pos=0) "NxShape * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: bool NxCloth::raycast(NxRay const & worldRay, NxVec3 & hit, NxU32 & vertexId) [member function] +> execution error W1009: The function takes as argument (name=vertexId, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxCloth::getShapePointers(NxShape * * shapePointers, NxU32 * flags=0) [member function] +> warning W1051: The function takes as argument (name=shapePointers, pos=0) "NxShape * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: void NxCloth::setShapePointers(NxShape * * shapePointers, unsigned int numShapes) [member function] +> warning W1051: The function takes as argument (name=shapePointers, pos=0) "NxShape * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: void NxCompartment::getTiming(NxReal & maxTimestep, NxU32 & maxIter, NxTimeStepMethod & method, NxU32 * numSubSteps=0) const [member function] +> execution error W1009: The function takes as argument (name=maxTimestep, pos=0) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxCompartment::getTiming(NxReal & maxTimestep, NxU32 & maxIter, NxTimeStepMethod & method, NxU32 * numSubSteps=0) const [member function] +> execution error W1009: The function takes as argument (name=maxIter, pos=1) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxCompartment::getTiming(NxReal & maxTimestep, NxU32 & maxIter, NxTimeStepMethod & method, NxU32 * numSubSteps=0) const [member function] +> execution error W1009: The function takes as argument (name=method, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxPhysicsSDK::getInternalVersion(NxU32 & apiRev, NxU32 & descRev, NxU32 & branchId) const [member function] +> execution error W1009: The function takes as argument (name=apiRev, pos=0) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxPhysicsSDK::getInternalVersion(NxU32 & apiRev, NxU32 & descRev, NxU32 & branchId) const [member function] +> execution error W1009: The function takes as argument (name=descRev, pos=1) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxPhysicsSDK::getInternalVersion(NxU32 & apiRev, NxU32 & descRev, NxU32 & branchId) const [member function] +> execution error W1009: The function takes as argument (name=branchId, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxJoint::getActors(NxActor * * actor1, NxActor * * actor2) [member function] +> warning W1051: The function takes as argument (name=actor1, pos=0) "NxActor * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: void NxJoint::getActors(NxActor * * actor1, NxActor * * actor2) [member function] +> warning W1051: The function takes as argument (name=actor2, pos=1) "NxActor * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: void NxJoint::getBreakable(NxReal & maxForce, NxReal & maxTorque) [member function] +> execution error W1009: The function takes as argument (name=maxForce, pos=0) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxJoint::getBreakable(NxReal & maxForce, NxReal & maxTorque) [member function] +> execution error W1009: The function takes as argument (name=maxTorque, pos=1) non-const reference to Python immutable type +> - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxJoint::getNextLimitPlane(NxVec3 & planeNormal, NxReal & planeD, NxReal * restitution=0) [member function] +> execution error W1009: The function takes as argument (name=planeD, pos=1) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxConvexMesh::getMassInformation(NxReal & mass, NxMat33 & localInertia, NxVec3 & localCenterOfMass) const [member function] +> execution error W1009: The function takes as argument (name=mass, pos=0) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxTriangleMesh::getMassInformation(NxReal & mass, NxMat33 & localInertia, NxVec3 & localCenterOfMass) const [member function] +> execution error W1009: The function takes as argument (name=mass, pos=0) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxScene::getCompartmentArray(NxCompartment * * userBuffer, NxU32 bufferSize, NxU32 & usersIterator) const [member function] +> warning W1051: The function takes as argument (name=userBuffer, pos=0) "NxCompartment * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::getCompartmentArray(NxCompartment * * userBuffer, NxU32 bufferSize, NxU32 & usersIterator) const [member function] +> execution error W1009: The function takes as argument (name=usersIterator, pos=2) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxScene::getActorGroupPairArray(NxActorGroupPair * userBuffer, NxU32 bufferSize, NxU32 & userIterator) const [member function] +> execution error W1009: The function takes as argument (name=userIterator, pos=2) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxScene::getFilterOps(NxFilterOp & op0, NxFilterOp & op1, NxFilterOp & op2) const [member function] +> execution error W1009: The function takes as argument (name=op0, pos=0) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxScene::getFilterOps(NxFilterOp & op0, NxFilterOp & op1, NxFilterOp & op2) const [member function] +> execution error W1009: The function takes as argument (name=op1, pos=1) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxScene::getFilterOps(NxFilterOp & op0, NxFilterOp & op1, NxFilterOp & op2) const [member function] +> execution error W1009: The function takes as argument (name=op2, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxActiveTransform * NxScene::getActiveTransforms(NxU32 & nbTransformsOut) [member function] +> execution error W1009: The function takes as argument (name=nbTransformsOut, pos=0) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxScene::getIslandArrayFromActor(NxActor & actor, NxActor * * userBuffer, NxU32 bufferSize, NxU32 & userIterator) [member function] +> warning W1051: The function takes as argument (name=userBuffer, pos=1) "NxActor * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::getIslandArrayFromActor(NxActor & actor, NxActor * * userBuffer, NxU32 bufferSize, NxU32 & userIterator) [member function] +> execution error W1009: The function takes as argument (name=userIterator, pos=3) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: NxU32 NxScene::getMaterialArray(NxMaterial * * userBuffer, NxU32 bufferSize, NxU32 & usersIterator) [member function] +> warning W1051: The function takes as argument (name=userBuffer, pos=0) "NxMaterial * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::getMaterialArray(NxMaterial * * userBuffer, NxU32 bufferSize, NxU32 & usersIterator) [member function] +> execution error W1009: The function takes as argument (name=usersIterator, pos=2) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxScene::getTiming(NxReal & maxTimestep, NxU32 & maxIter, NxTimeStepMethod & method, NxU32 * numSubSteps=0) const [member function] +> execution error W1009: The function takes as argument (name=maxTimestep, pos=0) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxScene::getTiming(NxReal & maxTimestep, NxU32 & maxIter, NxTimeStepMethod & method, NxU32 * numSubSteps=0) const [member function] +> execution error W1009: The function takes as argument (name=maxIter, pos=1) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxScene::getTiming(NxReal & maxTimestep, NxU32 & maxIter, NxTimeStepMethod & method, NxU32 * numSubSteps=0) const [member function] +> execution error W1009: The function takes as argument (name=method, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: bool NxScene::raycastAnyShape(NxRay const & worldRay, NxShapesType shapesType, NxU32 groups=0x0ffffffff, NxReal maxDist=3.4028234663852885981170418348451692544e+38, NxGroupsMask const * groupsMask=0, NxShape * * cache=0) const [member function] +> warning W1051: The function takes as argument (name=cache, pos=5) "NxShape * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: NxShape * NxScene::raycastClosestShape(NxRay const & worldRay, NxShapesType shapeType, NxRaycastHit & hit, NxU32 groups=0x0ffffffff, NxReal maxDist=3.4028234663852885981170418348451692544e+38, NxU32 hintFlags=0x0ffffffff, NxGroupsMask const * groupsMask=0, NxShape * * cache=0) const [member function] +> warning W1051: The function takes as argument (name=cache, pos=7) "NxShape * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::overlapSphereShapes(NxSphere const & worldSphere, NxShapesType shapeType, NxU32 nbShapes, NxShape * * shapes, NxUserEntityReport<NxShape*> * callback, NxU32 activeGroups=0x0ffffffff, NxGroupsMask const * groupsMask=0, bool accurateCollision=false) [member function] +> warning W1051: The function takes as argument (name=shapes, pos=3) "NxShape * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::overlapAABBShapes(NxBounds3 const & worldBounds, NxShapesType shapeType, NxU32 nbShapes, NxShape * * shapes, NxUserEntityReport<NxShape*> * callback, NxU32 activeGroups=0x0ffffffff, NxGroupsMask const * groupsMask=0, bool accurateCollision=false) [member function] +> warning W1051: The function takes as argument (name=shapes, pos=3) "NxShape * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::overlapOBBShapes(NxBox const & worldBox, NxShapesType shapeType, NxU32 nbShapes, NxShape * * shapes, NxUserEntityReport<NxShape*> * callback, NxU32 activeGroups=0x0ffffffff, NxGroupsMask const * groupsMask=0, bool accurateCollision=false) [member function] +> warning W1051: The function takes as argument (name=shapes, pos=3) "NxShape * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::overlapCapsuleShapes(NxCapsule const & worldCapsule, NxShapesType shapeType, NxU32 nbShapes, NxShape * * shapes, NxUserEntityReport<NxShape*> * callback, NxU32 activeGroups=0x0ffffffff, NxGroupsMask const * groupsMask=0, bool accurateCollision=false) [member function] +> warning W1051: The function takes as argument (name=shapes, pos=3) "NxShape * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: NxU32 NxScene::cullShapes(NxU32 nbPlanes, NxPlane const * worldPlanes, NxShapesType shapeType, NxU32 nbShapes, NxShape * * shapes, NxUserEntityReport<NxShape*> * callback, NxU32 activeGroups=0x0ffffffff, NxGroupsMask const * groupsMask=0) [member function] +> warning W1051: The function takes as argument (name=shapes, pos=4) "NxShape * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: bool NxUserContactModify::onContactConstraint(NxU32 & changeFlags, NxShape const * shape0, NxShape const * shape1, unsigned int const featureIndex0, unsigned int const featureIndex1, NxUserContactModify::NxContactCallbackData & data) [member function] +> execution error W1009: The function takes as argument (name=changeFlags, pos=0) non-const reference to Python immutable +> type - function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxUserNotify::onWake(NxActor * * actors, NxU32 count) [member function] +> warning W1051: The function takes as argument (name=actors, pos=0) "NxActor * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: void NxUserNotify::onSleep(NxActor * * actors, NxU32 count) [member function] +> warning W1051: The function takes as argument (name=actors, pos=0) "NxActor * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: bool NxUserEntityReport<NxShape*>::onEvent(NxU32 nbEntities, NxShape * * entities) [member function] +> warning W1051: The function takes as argument (name=entities, pos=1) "NxShape * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: void NxVec3::set(NxF32 const * v) [member function] +> execution error W1010: The function introduces registration order problem. For more information about the problem read next +> document: http://language-binding.net/pyplusplus/documentation/functions/registration_order.html Problematic functions +> list: void NxVec3::set(NxReal v) [member function] + +WARNING: void NxVec3::set(NxReal v) [member function] +> execution error W1010: The function introduces registration order problem. For more information about the problem read next +> document: http://language-binding.net/pyplusplus/documentation/functions/registration_order.html Problematic functions +> list: void NxVec3::set(NxF32 const * v) [member function] + +WARNING: void NxQuat::getAngleAxis(NxReal & angle, NxVec3 & axis) const [member function] +> execution error W1009: The function takes as argument (name=angle, pos=0) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: static void NxMath::sinCos(NxF32 f, NxF32 & s, NxF32 & c) [member function] +> execution error W1009: The function takes as argument (name=s, pos=1) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: static void NxMath::sinCos(NxF32 f, NxF32 & s, NxF32 & c) [member function] +> execution error W1009: The function takes as argument (name=c, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: static void NxMath::sinCos(NxF64 a, NxF64 & s, NxF64 & c) [member function] +> execution error W1009: The function takes as argument (name=s, pos=1) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: static void NxMath::sinCos(NxF64 a, NxF64 & s, NxF64 & c) [member function] +> execution error W1009: The function takes as argument (name=c, pos=2) non-const reference to Python immutable type - +> function could not be called from Python. Take a look on "Function Transformation" functionality and define the +> transformation. + +WARNING: void NxArray<NxShapeDesc*, NxAllocatorDefault>::insert(NxShapeDesc * * where, unsigned int n, NxShapeDesc * const & x) [member function] +> warning W1051: The function takes as argument (name=where, pos=0) "NxShapeDesc * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: void NxArray<NxShapeDesc*, NxAllocatorDefault>::erase(NxShapeDesc * * from, NxShapeDesc * * to) [member function] +> warning W1051: The function takes as argument (name=from, pos=0) "NxShapeDesc * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: void NxArray<NxShapeDesc*, NxAllocatorDefault>::erase(NxShapeDesc * * from, NxShapeDesc * * to) [member function] +> warning W1051: The function takes as argument (name=to, pos=1) "NxShapeDesc * *" type. You have to specify a call policies +> or to use "Function Transformation" functionality. + +WARNING: void NxArray<NxShapeDesc*, NxAllocatorDefault>::erase(NxShapeDesc * * from) [member function] +> warning W1051: The function takes as argument (name=from, pos=0) "NxShapeDesc * *" type. You have to specify a call +> policies or to use "Function Transformation" functionality. + +WARNING: void NxRemoteDebugger::writeParameter(NxReal const & parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_b50e9ef8956c46e675a5e7f008b9dba4") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(unsigned int const & parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_33a30e372c5a9d5913199818f4f0454e") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(NxVec3 const & parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_18b35e05d928635c0bfa5253d447a842") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(NxPlane const & parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_1659a6d9ec055830dc916179d6d14d2a") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(NxMat34 const & parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_3812119651c0f11b4ac08702ef96ec3c") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(NxMat33 const & parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_0b09a6446f1afac75d162902da79b1ce") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(NxU8 const * parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_04860cd33646aae9fd095b0c3ae34ece") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(char const * parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_0da5c0005a7bc75f48cd10b0b38fafa0") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(bool const & parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_40b26414dbb0b437ce5c428512b98e77") for function wrapper. + +WARNING: void NxRemoteDebugger::writeParameter(void const * parameter, void * object, bool create, char const * name, NxU32 mask) [member function] +> warning W1044: Py++ created an ugly alias ("writeParameter_7df00078d56d1bb262d4e9659c58bab9") for function wrapper. + +WARNING: _Nx3F32 [struct] +> execution error W1040: The declaration is unexposed, but there are other declarations, which refer to it. This could cause +> "no to_python converter found" run time error. Declarations: NxVec3::NxVec3(Nx3F32 const & d) [constructor] NxVec3 const +> & NxVec3::operator=(Nx3F32 const & d) [member operator] + +INFO: file "NxTireFunctionDesc.pypp.cpp" - updated( 0.000000 seconds ) +Source code was updated( 0.310500 minutes ). Added: trunk/python-ogre/code_generators/physx/customization_data.py =================================================================== --- trunk/python-ogre/code_generators/physx/customization_data.py (rev 0) +++ trunk/python-ogre/code_generators/physx/customization_data.py 2007-10-16 23:51:47 UTC (rev 429) @@ -0,0 +1,14 @@ + +def header_files( version ): + return [ 'NxPhysics.h' + ,"NxCooking.h" + ,"NxFoundation.h" + ,"NxCharacter.h" + ,"NxExtensions.h" + ,"PhysXLoader.h" + ,"NxStream.h" + ] + +def huge_classes( version ): + return [] + \ No newline at end of file Added: trunk/python-ogre/code_generators/physx/customization_data.pyc =================================================================== (Binary files differ) Property changes on: trunk/python-ogre/code_generators/physx/customization_data.pyc ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/python-ogre/code_generators/physx/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/physx/generate_code.py (rev 0) +++ trunk/python-ogre/code_generators/physx/generate_code.py 2007-10-16 23:51:47 UTC (rev 429) @@ -0,0 +1,519 @@ +#!/usr/bin/env python +# ----------------------------------------------------------------------------- +# This source file is part of Python-Ogre and is covered by the LGPL +# For the latest info, see http://python-ogre.org/ +# +# ----------------------------------------------------------------------------- + + +import os, sys, time, shutil + +#add environment to the path +sys.path.append( os.path.join( '..', '..' ) ) +#add common utils to the pass +sys.path.append( '..' ) +sys.path.append( '.' ) + +import environment +import common_utils +import customization_data +import hand_made_wrappers +##import register_exceptions + +from pygccxml import parser +from pygccxml import declarations +from pyplusplus import messages +from pyplusplus import module_builder +from pyplusplus import decl_wrappers + +from pyplusplus import function_transformers as ft +from pyplusplus.module_builder import call_policies +from pyplusplus.module_creator import sort_algorithms + +import common_utils.extract_documentation as exdoc +import common_utils.var_checker as varchecker +import common_utils.ogre_properties as ogre_properties + +MAIN_NAMESPACE = 'physx' + +## small helper function +def docit ( general, i, o ): + docs = "Python-Ogre (PhysX) Modified Function Call\\n" + general +"\\n" + docs = docs + "Input: " + i + "\\n" + docs = docs + "Output: " + o + "\\n\\\n" + return docs + +############################################################ +## +## Here is where we manually exclude stuff +## +############################################################ + +def ManualExclude ( mb ): + global_ns = mb.global_ns + + for c in global_ns.classes(): + for v in c.variables(allow_empty=True): + if v.access_type != 'public' : + v.exclude() + print "excluded", v, v.access_type + + + excludes=[ '::NxArray<NxShapeDesc*, NxAllocatorDefault>::begin' + ,'::NxArray<NxFluidEmitterDesc, NxAllocatorDefault>::deleteEntry' + ,'::NxArray<NxShapeDesc*, NxAllocatorDefault>::end' +# ,'::NxCloth::overlapAABBTriangles' # ugly argument that boost doesn't like.. To Fix in hand wrappers + # these have const refs to classes with protected desctuctors - a bad combination for boost + ,'::NxCookingInterface::NxCreatePMap' + ,'::NxForceField::releaseShape' + ,'::NxUtilLib::NxGetBoxEdgesAxes' +# ,'::NxHeightFieldShape::overlapAABBTrianglesDeprecated' + ,'::NxImplicitScreenMesh::getProjectionMatrix' # returns a const int pointer + ,'::NxVec3::get' + # not in source + ,'::NxBitField::rangeToDenseMask' + ,'::NxBitField::maskToShift' + + ] + for e in excludes: + print "excluding function", e + global_ns.member_functions(e).exclude() + excludes = [] + for e in excludes: + print "Excluding:", e + global_ns.free_functions(e).exclude() + + excludes = ['::NxPairFlag::objects'] + for e in excludes: + global_ns.variable(e).exclude() + for m in global_ns.member_functions('::NxVec3::get'): + if "const *" in m.decl_string: + m.exclude() + print "Excluding:", m + + global_ns.operator('::NxQuat::operator=', arg_types=['::NxVec3 const &']).exclude() + + for o in global_ns.operators('::NxMat33::operator()', arg_types=['int','int']): + if not "const" in o.decl_string: + o.exclude() + print "Excluding Operator:", o +############################################################ +## +## And there are things that manually need to be INCLUDED +## +############################################################ + +def ManualInclude ( mb ): + global_ns = mb.global_ns + + +############################################################ +## +## And things that need manual fixes, but not necessarly hand wrapped +## +############################################################ +def ManualFixes ( mb ): + + global_ns = mb.global_ns + + +############################################################ +## +## And things that need to have their argument and call values fixed. +## ie functions that pass pointers in the argument list and of course we need +## to read the updated values - so instead we pass them back +## as new values in a tuple (ETC ETC) +## +############################################################ + +def ManualTransformations ( mb ): + global_ns = mb.global_ns + main_ns = global_ns# .namespace( MAIN_NAMESPACE ) + + def create_output( size ): + return [ ft.output( i ) for i in range( size ) ] + + +############################################################################### +## +## Now for the AUTOMATIC stuff that should just work +## +############################################################################### + + +def AutoExclude( mb ): + """ Automaticaly exclude a range of things that don't convert well from C++ to Python + """ + global_ns = mb.global_ns + main_ns = global_ns # No namespaces in NxPhysics + + # vars that are static consts but have their values set in the header file are bad + Remove_Static_Consts ( main_ns ) + + ## Exclude protected and private that are not pure virtual + query = ~declarations.access_type_matcher_t( 'public' ) \ + & ~declarations.virtuality_type_matcher_t( declarations.VIRTUALITY_TYPES.PURE_VIRTUAL ) + try: + non_public_non_pure_virtual = main_ns.calldefs( query ) + non_public_non_pure_virtual.exclude() + except: + pass + + #Virtual functions that return reference could not be overriden from Python + query = declarations.virtuality_type_matcher_t( declarations.VIRTUALITY_TYPES.VIRTUAL ) \ + & declarations.custom_matcher_t( lambda decl: declarations.is_reference( decl.return_type ) ) + try: + main_ns.calldefs( query ).virtuality = declarations.VIRTUALITY_TYPES.NOT_VIRTUAL + except: + pass + +def AutoInclude( mb ): + global_ns = mb.global_ns + global_ns.exclude() + main_ns = global_ns ## NxPhysics doesn't have it's own namespace.. + for cls in main_ns.classes(): + try: + if cls.decl_string[2:4]=='Nx' and cls.decl_string[4].isupper(): + cls.include() + except: + pass + ## and we'll need the free functions as well + for funcs in main_ns.free_functions (): + if funcs.name[0:2]=='Nx' and funcs.name[2].isupper(): + funcs.include() + + for var in main_ns.variables (): + if len(var.name) > 2: + if var.name[0:2]=='Nx' and var.name[2].isupper(): + var.include() + for var in main_ns.typedefs (): + if len(var.name) > 2: + if var.name[0:2]=='Nx' and var.name[2].isupper(): + var.include() + ... [truncated message content] |
From: <and...@us...> - 2007-10-16 14:42:45
|
Revision: 428 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=428&view=rev Author: andy_miller Date: 2007-10-16 07:42:49 -0700 (Tue, 16 Oct 2007) Log Message: ----------- Typo in config, removed the 'strip'ing from the Sconscript for Linux as it was messing up the module installation. Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_posix.py trunk/python-ogre/SConstruct Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-16 00:05:06 UTC (rev 427) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-16 14:42:49 UTC (rev 428) @@ -135,7 +135,7 @@ ,os.path.join(PATH_OgreAddons,'videoplugin','theora','include') ,os.path.join(PATH_OgreAddons,'videoplugin','ptypes-1.8.3','include') ] -physxbase = os.path.joing(LOCAL_INCLUDE, 'PhysX','v2.7.2') +physxbase = os.path.join(LOCAL_INCLUDE, 'PhysX','v2.7.2') PATH_INCLUDE_PhysX= [ physxbase ,os.path.join(physxbase, 'Cooking','include') ,os.path.join(physxbase, 'Foundation','include') Modified: trunk/python-ogre/SConstruct =================================================================== --- trunk/python-ogre/SConstruct 2007-10-16 00:05:06 UTC (rev 427) +++ trunk/python-ogre/SConstruct 2007-10-16 14:42:49 UTC (rev 428) @@ -165,9 +165,9 @@ ## and lets have it install the output into the 'package_dir_name/ModuleName' dir and rename to the PydName _env.AddPostAction(package,\ 'mt.exe -nologo -manifest %(name)s.manifest -outputresource:%(name)s;2' % { 'name':package[index] } ) - else: - _env.AddPostAction(package,\ - '-strip -g -S -d --strip-debug -s %(name)s' % { 'name':package[index] } ) + #else: + # _env.AddPostAction(package,\ + # '-strip -g -S -d --strip-debug -s %(name)s' % { 'name':package[index] } ) _env.InstallAs(os.path.join(environment.package_dir_name, cls.parent, cls.ModuleName, cls.PydName), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-16 00:05:01
|
Revision: 427 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=427&view=rev Author: andy_miller Date: 2007-10-15 17:05:06 -0700 (Mon, 15 Oct 2007) Log Message: ----------- linux fixes Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_posix.py trunk/python-ogre/ThirdParty/quickgui/QuickGUIUtility.cpp Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-15 23:38:29 UTC (rev 426) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-16 00:05:06 UTC (rev 427) @@ -54,7 +54,7 @@ PATH_NxOgre= os.path.join(PATH_THIRDPARTY, 'nxogre') # PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.63final') -PATH_PhysX= os.path.join(BASE_DIR, 'AGEIA Technologies/SDK/v2.7.2/SDKs') +###PATH_PhysX= os.path.join(BASE_DIR, 'Physx/v2.7.2/SDKs') PATH_Theora= os.path.join(PATH_OgreAddons,'videoplugin','TheoraVideo') PATH_ffmpeg= os.path.join(BASE_DIR, 'ffmpeg') PATH_navi = os.path.join(BASE_DIR, 'navi','Navi') @@ -82,7 +82,7 @@ PATH_LIB_betagui = PATH_betagui PATH_LIB_quickgui = PATH_quickgui # PATH_LIB_NxOgre= os.path.join(LOCAL_LIB ) -PATH_LIB_PhysX = os.path.join(LOCAL_LIB) +PATH_LIB_PhysX = os.path.join(LOCAL_LIB, 'PhysX','v2.7.2') PATH_LIB_Bullet = os.path.join( LOCAL_LIB ) PATH_LIB_Theora= os.path.join(PATH_Theora, 'bin', 'Release') PATH_LIB_ogrevideoffmpeg = PATH_ogrevideoffmpeg @@ -135,11 +135,11 @@ ,os.path.join(PATH_OgreAddons,'videoplugin','theora','include') ,os.path.join(PATH_OgreAddons,'videoplugin','ptypes-1.8.3','include') ] - -PATH_INCLUDE_PhysX= [ os.path.join(PATH_PhysX, 'Physics','include') - ,os.path.join(PATH_PhysX, 'Cooking','include') - ,os.path.join(PATH_PhysX, 'Foundation','include') - ,os.path.join(PATH_PhysX, 'PhysXLoader','include') - ,os.path.join(PATH_PhysX, 'NxCharacter','include') - ,os.path.join(PATH_PhysX, 'NxExtensions','include') +physxbase = os.path.joing(LOCAL_INCLUDE, 'PhysX','v2.7.2') +PATH_INCLUDE_PhysX= [ physxbase + ,os.path.join(physxbase, 'Cooking','include') + ,os.path.join(physxbase, 'Foundation','include') + ,os.path.join(physxbase, 'PhysXLoader','include') + ,os.path.join(physxbase, 'NxCharacter','include') + ,os.path.join(physxbase, 'NxExtensions','include') ] Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIUtility.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIUtility.cpp 2007-10-15 23:38:29 UTC (rev 426) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIUtility.cpp 2007-10-16 00:05:06 UTC (rev 427) @@ -55,7 +55,7 @@ Ogre::String extension = fileName.substr(index + 1); Ogre::StringUtil::toLowerCase(extension); - Ogre::StringVector& supportedImageCodecs = Ogre::Codec::getExtensions(); + Ogre::StringVector supportedImageCodecs = Ogre::Codec::getExtensions(); return (std::find(supportedImageCodecs.begin(),supportedImageCodecs.end(),extension) != supportedImageCodecs.end()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-15 23:38:25
|
Revision: 426 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=426&view=rev Author: andy_miller Date: 2007-10-15 16:38:29 -0700 (Mon, 15 Oct 2007) Log Message: ----------- Linux fix for Quickgui Change order and method for patching boost Add bullet to the default build Modified Paths: -------------- trunk/python-ogre/ThirdParty/quickgui/QuickGUIExportDLL.h trunk/python-ogre/scripts/02-ExtractAndPatch.sh trunk/python-ogre/scripts/03-BuildTools.sh trunk/python-ogre/scripts/07-BuildModules.sh Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIExportDLL.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIExportDLL.h 2007-10-15 23:29:46 UTC (rev 425) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIExportDLL.h 2007-10-15 23:38:29 UTC (rev 426) @@ -1,16 +1,5 @@ #ifndef QUICKGUIEXPORTDLL_H #define QUICKGUIEXPORTDLL_H - -#ifndef _QuickGUIExport - #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 && !defined ( __MINGW32__ ) - # if defined( QUICKGUI_EXPORTS ) - # define _QuickGUIExport __declspec( dllexport ) - # else - # define _QuickGUIExport __declspec( dllimport ) - # endif - #else - # define _QuickGUIExport - #endif + +#define _QuickGUIExport #endif - -#endif Modified: trunk/python-ogre/scripts/02-ExtractAndPatch.sh =================================================================== --- trunk/python-ogre/scripts/02-ExtractAndPatch.sh 2007-10-15 23:29:46 UTC (rev 425) +++ trunk/python-ogre/scripts/02-ExtractAndPatch.sh 2007-10-15 23:38:29 UTC (rev 426) @@ -73,6 +73,8 @@ echo " -- Patching Boost" chmod -R +rw boost_1_34_0 cp -r python-ogre/boost/* boost_1_34_0 +sed -i s/BJAM_CONFIG=\"\"/BJAM_CONFIG=release/ boost_1_34_0/configure +sed -i s/'BOOST_PYTHON_MAX_ARITY 15'/'BOOST_PYTHON_MAX_ARITY 19'/ boost_1_34_0/boost/python/detail/preprocessor.hpp echo " -- Patching Ogre" patch -s -N -i ./python-ogre/patch/ogre.patch -p0 Modified: trunk/python-ogre/scripts/03-BuildTools.sh =================================================================== --- trunk/python-ogre/scripts/03-BuildTools.sh 2007-10-15 23:29:46 UTC (rev 425) +++ trunk/python-ogre/scripts/03-BuildTools.sh 2007-10-15 23:38:29 UTC (rev 426) @@ -24,20 +24,6 @@ echo " -- building boost" cd boost_1_34_0 ./configure --with-libraries=python --prefix=$PREFIX -cat << EOF > boost.patch ---- Makefile 2007-05-12 12:10:17.000000000 -0300 -+++ Makefile.new 2007-05-12 12:10:52.000000000 -0300 -@@ -1,6 +1,4 @@ --BJAM=./tools/jam/src/bin.linuxx86 --don't know how to make trie.c --...skipped bjam for lack of trie.c.../bjam -+BJAM=bjam -BJAM_CONFIG=release -PREFIX=/usr/local -EPREFIX=/usr/local -EOF -patch -N -p0 < boost.patch -sed -i s/'BOOST_PYTHON_MAX_ARITY 15'/'BOOST_PYTHON_MAX_ARITY 19'/ boost/python/detail/preprocessor.hpp make make install cd $INSTALL_DIR Modified: trunk/python-ogre/scripts/07-BuildModules.sh =================================================================== --- trunk/python-ogre/scripts/07-BuildModules.sh 2007-10-15 23:29:46 UTC (rev 425) +++ trunk/python-ogre/scripts/07-BuildModules.sh 2007-10-15 23:38:29 UTC (rev 426) @@ -12,7 +12,8 @@ then scons PROJECTS=$1 else - scons PROJECTS=ogre,ois,cegui,plib,ogreode,ogrenewt,ogreal,quickgui,et,caelum -i + scons PROJECTS=ogre,ois,cegui,plib,ogrenewt,ogreode,ogreal,quickgui,et,caelum,bullet +#,ogrebulletc,ogrebulletd -i fi #opcode -- not really suited to a linux build -- lots of work needed ? # This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-15 23:30:29
|
Revision: 425 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=425&view=rev Author: andy_miller Date: 2007-10-15 16:29:46 -0700 (Mon, 15 Oct 2007) Log Message: ----------- Fix for Linux ogrenewt and ogre renderqueuelistener Modified Paths: -------------- trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py trunk/python-ogre/environment.py Modified: trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py =================================================================== --- trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py 2007-10-15 23:13:19 UTC (rev 424) +++ trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py 2007-10-15 23:29:46 UTC (rev 425) @@ -851,8 +851,10 @@ rt = mb.class_( 'RenderQueueListener' ) print "WRAPPER CODE\n\n" - print rt.wrapper_code - rt.add_wrapper_code ( WRAPPER_WRAPPER_RenderQueueListener ) + print rt.wrapper_code +### AJM: this adds the required wrapper code however you need to edit renderqueuelistener.pypp.cpp to remove +### the duplicated function definations for it to compile correctly +##### rt.add_wrapper_code ( WRAPPER_WRAPPER_RenderQueueListener ) print "NOW\n\n" print rt.wrapper_code Modified: trunk/python-ogre/environment.py =================================================================== --- trunk/python-ogre/environment.py 2007-10-15 23:13:19 UTC (rev 424) +++ trunk/python-ogre/environment.py 2007-10-15 23:29:46 UTC (rev 425) @@ -249,7 +249,10 @@ active=True version = "1.0" parent = "ogre/physics" - libs = ['Newton', Config.LIB_Boost, 'OgreNewt_Main', 'OgreMain'] + if os.name =="nt": + libs = ['Newton', Config.LIB_Boost, 'OgreNewt_Main', 'OgreMain'] + else: + libs = ['Newton', Config.LIB_Boost, 'OgreNewt', 'OgreMain'] include_dirs = [Config.PATH_Boost , Config.PATH_Newton # only one path for Newton , Config.PATH_INCLUDE_Ogre @@ -656,7 +659,7 @@ class bullet: version= "2.62" parent = "ogre/physics" - libs=[Config.LIB_Boost, 'libbulletcollision', 'libbulletdynamics','libbulletmath'] + libs=[Config.LIB_Boost, 'LibBulletCollision', 'LibBulletDynamics'] #,'libbulletmath'] lib_dirs = [ Config.PATH_LIB_Boost , Config.PATH_LIB_Bullet ] @@ -675,7 +678,7 @@ cflags = "" parent = "ogre/physics" libs = [Config.LIB_Boost, 'OgreMain', - 'libbulletcollision', 'libbulletmath','libbulletdynamics' + 'LibBulletCollision', 'LibBulletDynamics' ] include_dirs = [Config.PATH_Boost , Config.PATH_INCLUDE_Bullet @@ -700,7 +703,7 @@ cflags = "" parent = "ogre/physics" libs = [Config.LIB_Boost, 'OgreMain', - 'libbulletcollision', 'libbulletmath','libbulletdynamics' + 'LibBulletCollision', 'LibBulletDynamics' ] include_dirs = [Config.PATH_Boost , Config.PATH_INCLUDE_Bullet This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-15 23:13:16
|
Revision: 424 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=424&view=rev Author: andy_miller Date: 2007-10-15 16:13:19 -0700 (Mon, 15 Oct 2007) Log Message: ----------- patch fixed to match latest ogre sdk release Modified Paths: -------------- trunk/python-ogre/patch/ogre.patch Modified: trunk/python-ogre/patch/ogre.patch =================================================================== --- trunk/python-ogre/patch/ogre.patch 2007-10-15 16:14:24 UTC (rev 423) +++ trunk/python-ogre/patch/ogre.patch 2007-10-15 23:13:19 UTC (rev 424) @@ -1,6 +1,6 @@ --- ogrenew/configure.in 2007-05-15 22:43:31.000000000 +0800 +++ ogrenew/configure.in 2007-05-15 22:43:18.000000000 +0800 -@@ -49,6 +49,7 @@ +@@ -59,6 +58,7 @@ ;; esac ]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-15 16:14:23
|
Revision: 423 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=423&view=rev Author: andy_miller Date: 2007-10-15 09:14:24 -0700 (Mon, 15 Oct 2007) Log Message: ----------- Linux fixes Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_posix.py trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Utils/OgreBulletConverter.h trunk/python-ogre/code_generators/ogrebulletc/generate_code.py trunk/python-ogre/code_generators/ogrebulletd/generate_code.py trunk/python-ogre/scripts/01-RetrieveSource.sh trunk/python-ogre/scripts/02-ExtractAndPatch.sh trunk/python-ogre/scripts/04-BuildBaseLibs.sh trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh trunk/python-ogre/scripts/master.sh Added Paths: ----------- trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPrerequisites.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h~ trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsPrerequisites.h Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-15 16:14:24 UTC (rev 423) @@ -53,7 +53,7 @@ PATH_ogrevideoffmpeg = os.path.join(PATH_THIRDPARTY,'ffmpeg') PATH_NxOgre= os.path.join(PATH_THIRDPARTY, 'nxogre') # PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') -PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.62') +PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.63final') PATH_PhysX= os.path.join(BASE_DIR, 'AGEIA Technologies/SDK/v2.7.2/SDKs') PATH_Theora= os.path.join(PATH_OgreAddons,'videoplugin','TheoraVideo') PATH_ffmpeg= os.path.join(BASE_DIR, 'ffmpeg') @@ -120,7 +120,7 @@ PATH_INCLUDE_quickgui = PATH_quickgui PATH_INCLUDE_NxOgre= PATH_NxOgre # PATH_INCLUDE_NxOgre= os.path.join(PATH_NxOgre, 'include') -PATH_INCLUDE_Bullet = os.path.join( LOCAL_INCLUDE ) +PATH_INCLUDE_Bullet = os.path.join( PATH_Bullet, 'src') PATH_INCLUDE_betagui = PATH_betagui PATH_INCLUDE_Theora = os.path.join (PATH_Theora,'include') PATH_INCLUDE_ogrevideoffmpeg = PATH_ogrevideoffmpeg Added: trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPrerequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPrerequisites.h (rev 0) +++ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPrerequisites.h 2007-10-15 16:14:24 UTC (rev 423) @@ -0,0 +1,89 @@ +/*************************************************************************** + +This source file is part of OGREBULLET +(Object-oriented Graphics Rendering Engine Bullet Wrapper) +For the latest info, see http://www.ogre3d.org/phpBB2addons/viewforum.php?f=10 + +Copyright (c) 2007 tua...@gm... + + + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place - Suite 330, Boston, MA 02111-1307, USA, or go to +http://www.gnu.org/copyleft/lesser.txt. +----------------------------------------------------------------------------- +*/ + +#ifndef _OGREBULLETCOLLISIONS_PREREQUISITES_H +#define _OGREBULLETCOLLISIONS_PREREQUISITES_H + +#include "btBulletCollisionCommon.h" + +#include "Ogre.h" + +/* Some <math.h> files do not define M_PI... */ +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +namespace OgreBulletCollisions +{ + class BtOgreConverter; + class OgreBtConverter; + + class CollisionsWorld; + + class CollisionRayResultCallback; + class CollisionClosestRayResultCallback; + + class DebugLines; + + class DebugDrawer; + + class DebugContact; + class DebugNormal; + class DebugContactText; + + class DebugCollisionShape; + class BoxDebugShape; + class SphereDebugShape; + class ConeDebugShape; + class TriangleMeshDebugShape; + class RayDebugShape; + + class CollisionShape; + class BoxCollisionShape; + class SphereCollisionShape; + class CylinderCollisionShape; + class ConeCollisionShape; + + class CompoundCollisionShape; + + class MultiSphereCollisionShape; + class MinkowskiSumCollisionShape; + + class ConvexHullCollisionShape; + class TriangleMeshCollisionShape; + + class Object; + + class ObjectState; + + typedef std::vector<Ogre::Vector3> Vector3Vector; + typedef std::map<unsigned char, Vector3Vector* > BoneIndex; + typedef std::pair<unsigned short, Vector3Vector* > BoneKeyIndex; + +} + +#endif //_OGREBULLETCOLLISIONS_PREREQUISITES_H + Modified: trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h =================================================================== --- trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h 2007-10-15 16:14:24 UTC (rev 423) @@ -27,7 +27,7 @@ #ifndef _OGREBULLETCOLLISIONS_Shape_H #define _OGREBULLETCOLLISIONS_Shape_H -#include "OgreBulletCollisionsPrerequisites.h" +#include "OgreBulletCollisionsPreRequisites.h" namespace OgreBulletCollisions Added: trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h~ =================================================================== --- trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h~ (rev 0) +++ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h~ 2007-10-15 16:14:24 UTC (rev 423) @@ -0,0 +1,57 @@ +/*************************************************************************** + +This source file is part of OGREBULLET +(Object-oriented Graphics Rendering Engine Bullet Wrapper) +For the latest info, see http://www.ogre3d.org/phpBB2addons/viewforum.php?f=10 + +Copyright (c) 2007 tua...@gm... + + + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place - Suite 330, Boston, MA 02111-1307, USA, or go to +http://www.gnu.org/copyleft/lesser.txt. +----------------------------------------------------------------------------- +*/ + +#ifndef _OGREBULLETCOLLISIONS_Shape_H +#define _OGREBULLETCOLLISIONS_Shape_H + +#include "OgreBulletCollisionsPrerequisites.h" + + +namespace OgreBulletCollisions +{ + // ------------------------------------------------------------------------- + // basic Shape + class CollisionShape + { + + public: + CollisionShape(); + virtual ~CollisionShape(); + + inline btCollisionShape* getBulletShape () {return mShape;}; + + virtual bool drawWireFrame(DebugLines *wire, + const Ogre::Vector3 &pos = Ogre::Vector3::ZERO, + const Ogre::Quaternion &quat= Ogre::Quaternion::IDENTITY) const; + + protected: + btCollisionShape* mShape; + bool drawConvexWireFrame(DebugLines *wire, const Ogre::Vector3 &pos, const Ogre::Quaternion &quat) const; + + }; +} +#endif //_OGREBULLETCOLLISIONS_Shape_H + Modified: trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Utils/OgreBulletConverter.h =================================================================== --- trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Utils/OgreBulletConverter.h 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Utils/OgreBulletConverter.h 2007-10-15 16:14:24 UTC (rev 423) @@ -26,7 +26,7 @@ #ifndef _OGREBULLETCOLLISIONS_OgreBtConverter_H #define _OGREBULLETCOLLISIONS_OgreBtConverter_H -#include "OgreBulletCollisionsPrerequisites.h" +#include "OgreBulletCollisionsPreRequisites.h" #include "OgreVector3.h" #include "OgreQuaternion.h" @@ -68,4 +68,4 @@ }; }; } -#endif //_OGREBULLETCOLLISIONS_OgreBtConverter_H \ No newline at end of file +#endif //_OGREBULLETCOLLISIONS_OgreBtConverter_H Added: trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsPrerequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsPrerequisites.h (rev 0) +++ trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsPrerequisites.h 2007-10-15 16:14:24 UTC (rev 423) @@ -0,0 +1,56 @@ +/*************************************************************************** + +This source file is part of OGREBULLET +(Object-oriented Graphics Rendering Engine Bullet Wrapper) +For the latest info, see http://www.ogre3d.org/phpBB2addons/viewforum.php?f=10 + +Copyright (c) 2007 tua...@gm... + + + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place - Suite 330, Boston, MA 02111-1307, USA, or go to +http://www.gnu.org/copyleft/lesser.txt. +----------------------------------------------------------------------------- +*/ + +#ifndef _OGREBULLETDYNAMICS_PREREQUISITES_H +#define _OGREBULLETDYNAMICS_PREREQUISITES_H + +#include "btBulletCollisionCommon.h" +#include "btBulletDynamicsCommon.h" + +#include "Ogre.h" +#include "OgreBulletCollisions.h" + + +namespace OgreBulletDynamics +{ + class RigidBody; + class PhysicState; + class DynamicsWorld; + + class TypedConstraint; + class HingeConstraint; + class SixDofConstraint; + class PointToPointConstraint; + class ConeTwistConstraint; + + class WheeledRigidBody; + class VehicleRayCaster; + class VehicleTuning; + class RaycastVehicle; + class WheelInfo; +} + +#endif //_OGREBULLETDYNAMICS_PREREQUISITES_H \ No newline at end of file Modified: trunk/python-ogre/code_generators/ogrebulletc/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/ogrebulletc/generate_code.py 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/code_generators/ogrebulletc/generate_code.py 2007-10-15 16:14:24 UTC (rev 423) @@ -198,8 +198,10 @@ xml_cached_fc = parser.create_cached_source_fc( os.path.join( environment.ogrebulletc.root_dir, "python_ogrebullet.h" ) , environment.ogrebulletc.cache_file ) - - defined_symbols = ["WIN32","NDEBUG","_WINDOWS", "_PRECOMP", 'OGRE_NONCLIENT_BUILD' ] + if os.name == 'nt': + defined_symbols = ["WIN32","NDEBUG","_WINDOWS", "_PRECOMP", 'OGRE_NONCLIENT_BUILD' ] + else: + defined_symbols = ["NDEBUG", "_PRECOMP", 'OGRE_NONCLIENT_BUILD' ] defined_symbols.append( 'VERSION_' + environment.ogrebulletc.version ) # Modified: trunk/python-ogre/code_generators/ogrebulletd/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/ogrebulletd/generate_code.py 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/code_generators/ogrebulletd/generate_code.py 2007-10-15 16:14:24 UTC (rev 423) @@ -194,7 +194,10 @@ os.path.join( environment.ogrebulletd.root_dir, "python_ogrebullet.h" ) , environment.ogrebulletd.cache_file ) - defined_symbols = ["WIN32","NDEBUG","_WINDOWS", "_PRECOMP", 'OGRE_NONCLIENT_BUILD' ] + if os.name == 'nt': + defined_symbols = ["WIN32","NDEBUG","_WINDOWS", "_PRECOMP", 'OGRE_NONCLIENT_BUILD' ] + else: + defined_symbols = ["NDEBUG", "_PRECOMP", 'OGRE_NONCLIENT_BUILD' ] defined_symbols.append( 'VERSION_' + environment.ogrebulletd.version ) # Modified: trunk/python-ogre/scripts/01-RetrieveSource.sh =================================================================== --- trunk/python-ogre/scripts/01-RetrieveSource.sh 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/scripts/01-RetrieveSource.sh 2007-10-15 16:14:24 UTC (rev 423) @@ -27,6 +27,7 @@ $WGET http://downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz $WGET http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.0.tar.gz $WGET http://downloads.sourceforge.net/zziplib/zziplib-0.13.49.tar.bz2 +$WGET http://downloads.sourceforge.net/bullet/bullet-2.63final.tgz popd cd $INSTALL_DIR echo " -- getting pygccxml" Modified: trunk/python-ogre/scripts/02-ExtractAndPatch.sh =================================================================== --- trunk/python-ogre/scripts/02-ExtractAndPatch.sh 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/scripts/02-ExtractAndPatch.sh 2007-10-15 16:14:24 UTC (rev 423) @@ -83,7 +83,8 @@ echo "EMPTY" >>./INSTALL echo "EMPTY" >>./NEWS popd - +echo " -- Unpacking Bullet" +tar zxf $DOWNLOADS/bullet-2.63final.tgz echo echo "== Finished Extraction and Patching ==" echo Modified: trunk/python-ogre/scripts/04-BuildBaseLibs.sh =================================================================== --- trunk/python-ogre/scripts/04-BuildBaseLibs.sh 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/scripts/04-BuildBaseLibs.sh 2007-10-15 16:14:24 UTC (rev 423) @@ -64,13 +64,13 @@ ./configure --prefix=$PREFIX make make install -cd ReferenceApplication -aclocal -./bootstrap -./configure --prefix=$PREFIX -make -make install -cd .. +#cd ReferenceApplication +#aclocal +#./bootstrap +#./configure --prefix=$PREFIX +#make +#make install +#cd .. popd echo Modified: trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh =================================================================== --- trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh 2007-10-15 16:14:24 UTC (rev 423) @@ -63,5 +63,10 @@ # # Bullet # -##pushd bullet-2.62a +echo " -- Building Bullet --" +pushd bullet-2.63final +cmake . -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX +make +find . -name *.a -execdir cp {} $PREFIX/lib \; +popd Modified: trunk/python-ogre/scripts/master.sh =================================================================== --- trunk/python-ogre/scripts/master.sh 2007-10-14 07:54:01 UTC (rev 422) +++ trunk/python-ogre/scripts/master.sh 2007-10-15 16:14:24 UTC (rev 423) @@ -3,12 +3,12 @@ # Run them all -- or at least the ones you need # Notes that 00-PreReqs is probably Ubuntu dependent.. -source ./00-PreReqs.sh -source ./01-RetrieveSource.sh -source ./02-ExtractAndPatch.sh -source ./03-BuildTools.sh -source ./04-BuildBaseLibs.sh -source ./05-BuildAdditionalLibs.sh +#source ./00-PreReqs.sh +#source ./01-RetrieveSource.sh +#source ./02-ExtractAndPatch.sh +#source ./03-BuildTools.sh +#source ./04-BuildBaseLibs.sh +#source ./05-BuildAdditionalLibs.sh source ./06-GenerateCode.sh source ./07-BuildModules.sh This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-14 07:54:00
|
Revision: 422 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=422&view=rev Author: andy_miller Date: 2007-10-14 00:54:01 -0700 (Sun, 14 Oct 2007) Log Message: ----------- NxOgre moved to Thirdparty to make the linux build possible (hopefully) Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_nt.py trunk/python-ogre/PythonOgreConfig_posix.py trunk/python-ogre/code_generators/nxogre/generate_code.py trunk/python-ogre/environment.py Added Paths: ----------- trunk/python-ogre/ThirdParty/nxogre/ trunk/python-ogre/ThirdParty/nxogre/NxOgre.h trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.h trunk/python-ogre/ThirdParty/nxogre/NxOgreActorBlueprint.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreActorBlueprint.h trunk/python-ogre/ThirdParty/nxogre/NxOgreBlueprint.h trunk/python-ogre/ThirdParty/nxogre/NxOgreBody.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreBody.h trunk/python-ogre/ThirdParty/nxogre/NxOgreCharacter.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreCharacter.h trunk/python-ogre/ThirdParty/nxogre/NxOgreCharacterController.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreCharacterController.h trunk/python-ogre/ThirdParty/nxogre/NxOgreCharacterHitReport.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreCharacterHitReport.h trunk/python-ogre/ThirdParty/nxogre/NxOgreCloth.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreCloth.h trunk/python-ogre/ThirdParty/nxogre/NxOgreClothRaycaster.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreClothRaycaster.h trunk/python-ogre/ThirdParty/nxogre/NxOgreCollisionModel.h trunk/python-ogre/ThirdParty/nxogre/NxOgreCompound.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreCompound.h trunk/python-ogre/ThirdParty/nxogre/NxOgreContainer.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreContainer.h trunk/python-ogre/ThirdParty/nxogre/NxOgreCooking.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreCooking.h trunk/python-ogre/ThirdParty/nxogre/NxOgreDebugRenderer.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreDebugRenderer.h trunk/python-ogre/ThirdParty/nxogre/NxOgreDominanceGroup.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreDominanceGroup.h trunk/python-ogre/ThirdParty/nxogre/NxOgreEnumsBlueprint.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreEnumsBlueprint.h trunk/python-ogre/ThirdParty/nxogre/NxOgreError.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreError.h trunk/python-ogre/ThirdParty/nxogre/NxOgreFluid.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreFluid.h trunk/python-ogre/ThirdParty/nxogre/NxOgreFluidMesh.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreFluidMesh.h trunk/python-ogre/ThirdParty/nxogre/NxOgreForceField.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreForceField.h trunk/python-ogre/ThirdParty/nxogre/NxOgreGlobalFunctions.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreGroup.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreGroup.h trunk/python-ogre/ThirdParty/nxogre/NxOgreHelper.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreHelper.h trunk/python-ogre/ThirdParty/nxogre/NxOgreHelpers.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreHelpers.h trunk/python-ogre/ThirdParty/nxogre/NxOgreIntersection.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreIntersection.h trunk/python-ogre/ThirdParty/nxogre/NxOgreJSON.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreJSON.h trunk/python-ogre/ThirdParty/nxogre/NxOgreJSONCollection.h trunk/python-ogre/ThirdParty/nxogre/NxOgreJSONRead.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreJSONSchema.h trunk/python-ogre/ThirdParty/nxogre/NxOgreJSONWrite.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreJoint.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreJoint.h trunk/python-ogre/ThirdParty/nxogre/NxOgreJointSet1.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreJointSet1.h trunk/python-ogre/ThirdParty/nxogre/NxOgreJointSet2.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreJointSet2.h trunk/python-ogre/ThirdParty/nxogre/NxOgreLog.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreLog.h trunk/python-ogre/ThirdParty/nxogre/NxOgreMaterial.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreMaterial.h trunk/python-ogre/ThirdParty/nxogre/NxOgreMeshManager.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreMeshManager.h trunk/python-ogre/ThirdParty/nxogre/NxOgreMotor.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreMotor.h trunk/python-ogre/ThirdParty/nxogre/NxOgreNxSerialiser.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreNxSerialiser.h trunk/python-ogre/ThirdParty/nxogre/NxOgreNxuStreamSerialiser.h trunk/python-ogre/ThirdParty/nxogre/NxOgreParametersBlueprint.h trunk/python-ogre/ThirdParty/nxogre/NxOgreParams.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreParams.h trunk/python-ogre/ThirdParty/nxogre/NxOgrePhysXDriver.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgrePhysXDriver.h trunk/python-ogre/ThirdParty/nxogre/NxOgrePose.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgrePose.h trunk/python-ogre/ThirdParty/nxogre/NxOgrePrerequisites.h trunk/python-ogre/ThirdParty/nxogre/NxOgreRaycaster.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreRaycaster.h trunk/python-ogre/ThirdParty/nxogre/NxOgreRemoteDebuggerConnection.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreRemoteDebuggerConnection.h trunk/python-ogre/ThirdParty/nxogre/NxOgreScene.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreScene.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneBlueprint.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneBlueprint.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneContactController.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneContactController.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneController.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneController.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneTriggerController.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSceneTriggerController.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSerialiser.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSerialiser.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShape.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShape.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprint.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprint.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintConvex.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintConvex.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintMesh.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintMesh.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintPrimitives.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintPrimitives.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintTerrain.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintTerrain.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintWheel.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeBlueprintWheel.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeConvex.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeConvex.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeDescription.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeDescriptionConvex.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeDescriptionMesh.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeDescriptionPrimitives.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeDescriptionTerrain.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeDescriptionWheel.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeMesh.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeMesh.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapePrimitives.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapePrimitives.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeTerrain.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeTerrain.h trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeWheel.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreShapeWheel.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSimpleShape.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSimpleShape.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSkeleton.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSkeleton.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSoftBody.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSoftBody.h trunk/python-ogre/ThirdParty/nxogre/NxOgreStable.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreStable.h trunk/python-ogre/ThirdParty/nxogre/NxOgreState.h trunk/python-ogre/ThirdParty/nxogre/NxOgreStateMachine.h trunk/python-ogre/ThirdParty/nxogre/NxOgreSummary.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreSummary.h trunk/python-ogre/ThirdParty/nxogre/NxOgreTesting.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreTesting.h trunk/python-ogre/ThirdParty/nxogre/NxOgreTrigger.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreTrigger.h trunk/python-ogre/ThirdParty/nxogre/NxOgreUserAllocator.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreUserAllocator.h trunk/python-ogre/ThirdParty/nxogre/NxOgreUserData.h trunk/python-ogre/ThirdParty/nxogre/NxOgreUserStream.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreUserStream.h trunk/python-ogre/ThirdParty/nxogre/NxOgreWorld.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreWorld.h trunk/python-ogre/ThirdParty/nxogre/NxOgreWorldBlueprint.cpp trunk/python-ogre/ThirdParty/nxogre/NxOgreWorldBlueprint.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/ trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Asc2Bin.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Asc2Bin.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_ColladaExport.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_ColladaExport.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_ColladaImport.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_ColladaImport.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_File.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_File.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Geometry.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Geometry.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_GraphicsMesh.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_GraphicsMesh.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_PhysicsExport.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_PhysicsExport.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_PhysicsInstantiator.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_PhysicsInstantiator.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Schema.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Schema.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_SchemaStream.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_SchemaStream.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_SchemaTypes.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Streaming.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_Streaming.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_cooking.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_cooking.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_customcopy.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_customcopy.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_helper.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_helper.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_hull.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_hull.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_string.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_string.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_tinystr.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_tinystr.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_tinyxml.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_tinyxml.h trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_tinyxmlerror.cpp trunk/python-ogre/ThirdParty/nxogre/NxuStream2/NXU_tinyxmlparser.cpp Modified: trunk/python-ogre/PythonOgreConfig_nt.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-14 04:33:53 UTC (rev 421) +++ trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-14 07:54:01 UTC (rev 422) @@ -45,9 +45,10 @@ PATH_plib = os.path.join(PATH_THIRDPARTY, 'plib') PATH_et = os.path.join(PATH_THIRDPARTY, 'et') PATH_caelum = os.path.join(PATH_THIRDPARTY, 'caelum') +PATH_NxOgre= os.path.join(PATH_THIRDPARTY, 'nxogre') +# PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') PATH_ogrevideoffmpeg = os.path.join(PATH_THIRDPARTY,'ffmpeg') -PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.62') PATH_PhysX= "c:/program files/AGEIA Technologies/SDK/v2.7.2/SDKs" PATH_Theora= os.path.join(PATH_OgreAddons,'videoplugin','TheoraVideo') @@ -80,7 +81,7 @@ PATH_LIB_OgreAL = os.path.join( PATH_OGREAL)#, 'lib/Release' ) PATH_LIB_betagui = PATH_betagui PATH_LIB_quickgui = PATH_quickgui -PATH_LIB_NxOgre= os.path.join(PATH_NxOgre, 'lib') +# PATH_LIB_NxOgre= os.path.join(PATH_NxOgre, 'lib') PATH_LIB_PhysX = os.path.join(PATH_PhysX,'lib/win32') PATH_LIB_Bullet = os.path.join(PATH_Bullet, 'out/release8/libs' ) PATH_LIB_Theora= os.path.join(PATH_Theora, 'bin', 'Release') @@ -124,7 +125,8 @@ PATH_INCLUDE_FMOD = os.path.join(PATH_FMOD, 'api/inc') PATH_INCLUDE_Ogre_CEGUIRenderer = os.path.join( PATH_Ogre, 'samples/Common/CEGUIRenderer/include') PATH_INCLUDE_quickgui = PATH_quickgui -PATH_INCLUDE_NxOgre= os.path.join(PATH_NxOgre, 'include') +PATH_INCLUDE_NxOgre= PATH_NxOgre +# PATH_INCLUDE_NxOgre= os.path.join(PATH_NxOgre, 'include') PATH_INCLUDE_Bullet= os.path.join(PATH_Bullet, 'src') PATH_INCLUDE_freetype= os.path.join(PATH_INCLUDE_quickgui,'FreeType2.3.5') PATH_INCLUDE_betagui = PATH_betagui Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-14 04:33:53 UTC (rev 421) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-14 07:54:01 UTC (rev 422) @@ -51,7 +51,8 @@ PATH_caelum = os.path.join(PATH_THIRDPARTY, 'caelum') PATH_ogrevideoffmpeg = os.path.join(PATH_THIRDPARTY,'ffmpeg') -PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') +PATH_NxOgre= os.path.join(PATH_THIRDPARTY, 'nxogre') +# PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.62') PATH_PhysX= os.path.join(BASE_DIR, 'AGEIA Technologies/SDK/v2.7.2/SDKs') PATH_Theora= os.path.join(PATH_OgreAddons,'videoplugin','TheoraVideo') @@ -80,7 +81,7 @@ PATH_LIB_OgreAL = os.path.join( LOCAL_LIB ) #PATH_OGREAL, 'lib/Release' ) PATH_LIB_betagui = PATH_betagui PATH_LIB_quickgui = PATH_quickgui -PATH_LIB_NxOgre= os.path.join(LOCAL_LIB ) +# PATH_LIB_NxOgre= os.path.join(LOCAL_LIB ) PATH_LIB_PhysX = os.path.join(LOCAL_LIB) PATH_LIB_Bullet = os.path.join( LOCAL_LIB ) PATH_LIB_Theora= os.path.join(PATH_Theora, 'bin', 'Release') @@ -117,7 +118,8 @@ PATH_INCLUDE_FMOD = "" PATH_INCLUDE_Ogre_CEGUIRenderer = os.path.join( PATH_Ogre, 'Samples/Common/CEGUIRenderer/include') PATH_INCLUDE_quickgui = PATH_quickgui -PATH_INCLUDE_NxOgre= os.path.join(PATH_NxOgre, 'include') +PATH_INCLUDE_NxOgre= PATH_NxOgre +# PATH_INCLUDE_NxOgre= os.path.join(PATH_NxOgre, 'include') PATH_INCLUDE_Bullet = os.path.join( LOCAL_INCLUDE ) PATH_INCLUDE_betagui = PATH_betagui PATH_INCLUDE_Theora = os.path.join (PATH_Theora,'include') Added: trunk/python-ogre/ThirdParty/nxogre/NxOgre.h =================================================================== --- trunk/python-ogre/ThirdParty/nxogre/NxOgre.h (rev 0) +++ trunk/python-ogre/ThirdParty/nxogre/NxOgre.h 2007-10-14 07:54:01 UTC (rev 422) @@ -0,0 +1,90 @@ +// +// NxOgre a wrapper for the PhysX (formerly Novodex) physics library and the Ogre 3D rendering engine. +// Copyright (C) 2005 - 2007 Robin Southern and NxOgre.org http://www.nxogre.org +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#ifndef __NXOGRE_H__ +#define __NXOGRE_H__ + +/////////////////////////////////////////// + +#include "NxOgreStable.h" +#include "NxOgrePrerequisites.h" +#include "NxOgrePhysXDriver.h" +#include "NxOgreError.h" +#include "NxOgreLog.h" + +/////////////////////////////////////////// + +#include "NxOgreActor.h" +#include "NxOgreActorBlueprint.h" +#include "NxOgreBody.h" +#include "NxOgreContainer.h" +#include "NxOgreCooking.h" +#include "NxOgreCharacter.h" +#include "NxOgreCharacterController.h" +#include "NxOgreCharacterHitReport.h" +#include "NxOgreCloth.h" +#include "NxOgreClothRaycaster.h" +#include "NxOgreCompound.h" +#include "NxOgreDebugRenderer.h" +#include "NxOgreDominanceGroup.h" +#include "NxOgreEnumsBlueprint.h" +#include "NxOgreFluid.h" +#include "NxOgreFluidMesh.h" +#include "NxOgreForceField.h" +#include "NxOgreGroup.h" +#include "NxOgreHelpers.h" +#include "NxOgreJointSet1.h" +#include "NxOgreJointSet2.h" +#include "NxOgreHelper.h" +#include "NxOgreIntersection.h" +#include "NxOgreMaterial.h" +#include "NxOgreMotor.h" +#include "NxOgreParams.h" +#include "NxOgrePose.h" +#include "NxOgreRaycaster.h" +#include "NxOgreRemoteDebuggerConnection.h" +#include "NxOgreSerialiser.h" +#include "NxOgreScene.h" +#include "NxOgreSceneBlueprint.h" +#include "NxOgreSceneController.h" +#include "NxOgreSceneContactController.h" +#include "NxOgreShape.h" +#include "NxOgreShapeBlueprint.h" +#include "NxOgreShapeBlueprintConvex.h" +#include "NxOgreShapeBlueprintMesh.h" +#include "NxOgreShapeBlueprintPrimitives.h" +#include "NxOgreShapeBlueprintTerrain.h" +#include "NxOgreShapeBlueprintWheel.h" +#include "NxOgreShapeConvex.h" +#include "NxOgreShapeMesh.h" +#include "NxOgreShapePrimitives.h" +#include "NxOgreShapeTerrain.h" +#include "NxOgreShapeWheel.h" +#include "NxOgreSimpleShape.h" +#include "NxOgreSoftBody.h" +#include "NxOgreState.h" +#include "NxOgreStateMachine.h" +#include "NxOgreTesting.h" +#include "NxOgreTrigger.h" +#include "NxOgreUserStream.h" +#include "NxOgreUserAllocator.h" +#include "NxOgreWorld.h" +#include "NxOgreWorldBlueprint.h" + +#endif Added: trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.cpp =================================================================== --- trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.cpp 2007-10-14 07:54:01 UTC (rev 422) @@ -0,0 +1,1117 @@ +// +// NxOgre a wrapper for the PhysX (formerly Novodex) physics library and the Ogre 3D rendering engine. +// Copyright (C) 2005 - 2007 Robin Southern and NxOgre.org http://www.nxogre.org +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#include "NxOgreStable.h" +#include "NxOgreActor.h" +#include "NxOgreActorBlueprint.h" +#include "NxOgreUserData.h" // For NxActorUserData for NxActor +#include "NxOgrePose.h" // For conversions +#include "NxOgreHelpers.h" // For conversions +#include "NxOgreScene.h" // For Actor::mOwner +#include "NxOgreShapeBlueprint.h" // For ShapeBlueprint System +#include "NxOgreDominanceGroup.h" // For Dominance Groups +#include "NxOgreGroup.h" // For ActorGroup and ShapeGroups +#include "NxOgreContainer.h" // For Getting an ActorGroup +#include "NxOgreActorBlueprint.h" // For Quick Duplication. + +namespace NxOgre { + +////////////////////////////////////////////////////////// + +void ActorParams::setToDefault() { + + mDensity = 0.0f; + mActorFlags = 0; + mGroupAsIndex = 0; + mGroupAsName = ""; +#if NX_SDK_VERSION_NUMBER >= 272 + mDominanceGroupAsIndex = 0; + mDominanceGroupAsName = ""; +#endif +#if NX_SDK_VERSION_NUMBER >= 260 + mCompartment = NULL; +#endif + mMassLocalPose . id(); + mMassSpaceInertia . zero(); + mLinearVelocity . zero(); + mAngularVelocity . zero(); + mWakeUpCounter = 20.0f*0.02f; + mMass = 10.0f; + mLinearDamping = 0.0f; + mAngularDamping = 0.05f; + mMaxAngularVelocity = -1.0f; + mBodyFlags = NX_BF_VISUALIZATION; + mSleepLinearVelocity = -1.0f; + mSleepAngularVelocity = -1.0f; + mCCDMotionThreshold = 0.0f; + mSolverIterationCount = 4; + mBodyFlags = NX_BF_ENERGY_SLEEP_TEST; + mSleepEnergyThreshold = -1.0f; + mSleepDamping = 0.0f; + + mNodeScale = Ogre::Vector3(1,1,1); + mNodeName = ""; + mNodeShadows = true; + +} + +////////////////////////////////////////////////////////// + +void ActorParams::parse(Parameters P) { + + for (Parameters::iterator p = P.begin(); p != P.end();p++) { + + if ((*p).first == "static") { + if ( (*p).second.substr(0,1) == "y" || (*p).second.substr(0,1) == "Y") { + mMass = 0; + mDensity = 0; + continue; + } + else { + mMass = 10; + mDensity = 0; + } + } + + if ((*p).first == "kinematic") { + if ( (*p).second.substr(0,1) == "y" || (*p).second.substr(0,1) == "Y") { + mBodyFlags |= NX_BF_KINEMATIC; + if (mMass == 0 || mDensity == 0) { + mMass = 1; + mDensity = 0; + } + } + } + + if (Set("density", (*p), mDensity)) continue; + if (Set("group", (*p), mGroupAsName)) continue; + if (Set("group-index", (*p), mGroupAsIndex)) continue; +#if NX_SDK_VERSION_NUMBER >= 272 + if (Set("dominancegroup", (*p), mDominanceGroupAsName)) continue; + if (Set("dominancegroup-index", (*p), mDominanceGroupAsIndex)) continue; +#endif + if (Set("massspaceinertia", (*p), mMassSpaceInertia)) continue; + if (Set("linearvelocity", (*p), mLinearVelocity)) continue; + if (Set("angularvelocity", (*p), mAngularVelocity)) continue; + if (Set("wakeupcounter", (*p), mWakeUpCounter)) continue; + if (Set("mass", (*p), mMass)) continue; + if (Set("lineardamping", (*p), mLinearDamping)) continue; + if (Set("angulardamping", (*p), mAngularDamping)) continue; + if (Set("maxangularvelocity", (*p), mMaxAngularVelocity)) continue; + if (Set("sleepangularvelocity", (*p), mSleepAngularVelocity)) continue; + if (Set("ccdmotionthreshold", (*p), mCCDMotionThreshold)) continue; + if (Set("solveriterationcount", (*p), mSolverIterationCount)) continue; + if (Set("sleepenergythreshold", (*p), mSleepEnergyThreshold)) continue; + if (Set("sleepdamping", (*p), mSleepDamping)) continue; + if (Set("node-scale", (*p), mNodeScale)) continue; + if (Set("node-shadows", (*p), mNodeShadows)) continue; + if (Set("node", (*p), mNodeName)) continue; + + } + +} + +////////////////////////////////////////////////////////// + +void ActorParams::fromNxActorDesc(NxActorDesc& desc) { + + mDensity = desc.density; + mActorFlags = desc.flags; + mGroupAsIndex = desc.group; +#if NX_SDK_VERSION_NUMBER >= 272 + mDominanceGroupAsIndex = desc.dominanceGroup; +#endif +#if NX_SDK_VERSION_NUMBER >= 260 + mCompartment = desc.compartment; +#endif +} + +////////////////////////////////////////////////////////// + +void ActorParams::fromNxBodyDesc(NxBodyDesc& desc) { + + mMassLocalPose = desc.massLocalPose; + mMassSpaceInertia = desc.massSpaceInertia; + mLinearVelocity = desc.linearVelocity; + mAngularVelocity = desc.angularVelocity; + mWakeUpCounter = desc.wakeUpCounter; + mMass = desc.mass; + mLinearDamping = desc.linearDamping; + mAngularDamping = desc.angularDamping; + mMaxAngularVelocity = desc.maxAngularVelocity; + mBodyFlags = desc.flags; + mSleepLinearVelocity = desc.sleepLinearVelocity; + mSleepAngularVelocity = desc.sleepAngularVelocity; + mCCDMotionThreshold = desc.CCDMotionThreshold; + mSolverIterationCount = desc.solverIterationCount; + mBodyFlags = desc.flags; + mSleepEnergyThreshold = desc.sleepEnergyThreshold; + mSleepDamping = desc.sleepDamping; + +} + +////////////////////////////////////////////////////////// + +Actor::Actor(const NxString& Identifier, Scene* scene, bool isActorBased) : mName(Identifier), mOwner(scene) { + mActor = 0; + if (isActorBased) + mOwner->_registerActor(mName, this); +} + +////////////////////////////////////////////////////////// + +Actor::Actor(const NxString& name, Scene* scene, ShapeBlueprint *shape, const Pose& pose, ActorParams params) : mName(name), mOwner(scene) { + + if (name.length() == 0) { + mName = NxCreateID(scene->getNbActors(), "Actor"); + mVisualIdentifier = NxString(); + } + else { + + std::vector<NxString> splitID = Ogre::StringUtil::split(name, ";", 2); + + NxString identifier; + + if (splitID.size() == 1) { + identifier = name; + mVisualIdentifier = name; + } + else { + identifier = splitID[0]; + mVisualIdentifier = splitID[1]; + Ogre::StringUtil::trim(mVisualIdentifier); + } + + Ogre::StringUtil::trim(identifier); + + if (identifier.substr(0,1) == ">") { + mName = identifier.substr(1, identifier.length() - 1); + if (scene->getActors()->has(mName)) { + NxThrow_Error("Duplicate Actor with identifier '" + mName + "' found!"); + } + + } + else if (scene->getActors()->has(identifier)) { + // Generate a identifier based on the the suggested name. + // i.e. + // myBody -> myBody 1 + // myBody10 -> myBody 11 + + Actors actors; + scene->getActors()->CopyTo(actors); + + NxU32 highest = 0; + NxString workingName; + for(Actor* a = actors.begin();a = actors.next();) { + if (Ogre::StringUtil::startsWith(a->getName(), identifier, false)) { + workingName = a->getName(); + workingName = workingName.substr(identifier.length(), workingName.length() - identifier.length()); + std::stringstream ss(workingName); + NxU32 current = 0; + ss >> current; + if (current > highest) + highest = current; + } + } + + highest++; + mName = identifier; + mName.append(Ogre::StringConverter::toString(highest)); + } + else { + mName = identifier; + } + } + + _createActor(shape,pose,params); + mOwner->_registerActor(mName, this); +} + +////////////////////////////////////////////////////////// + +Actor::~Actor() { + + mOwner->_unregisterActor(mName); + + if (!isDead()) + _destroyActor(); + +} + +////////////////////////////////////////////////////////// + +void Actor::_createActor(ShapeBlueprint *shape, const Pose& pose, ActorParams params) { + + NxActorDesc ad; + NxBodyDesc bd; + ad.setToDefault(); + bd.setToDefault(); + + mNxActorUserData = new NxActorUserData(this, NxActorUserData::T_Actor); +#if NX_SDK_VERSION_NUMBER >= 260 + ad.compartment = params.mCompartment; +#endif + if (params.mMass == 0) + ad.density = params.mDensity; +#if NX_SDK_VERSION_NUMBER >= 272 + if (params.mDominanceGroupAsIndex != 0) + ad.dominanceGroup = params.mDominanceGroupAsIndex; + else if (params.mDominanceGroupAsName.length() > 0) + ad.dominanceGroup = mOwner->getDominanceGroup(params.mDominanceGroupAsName)->getGroupID(); +#endif + ad.flags = params.mActorFlags; + + ad.globalPose.t = pose.getVec3(); + ad.globalPose.M.fromQuat(pose.getQuat()); + + if (params.mGroupAsIndex != 0) + ad.group = params.mGroupAsIndex; + else if (params.mGroupAsName.length() > 0) + ad.group = mOwner->getActorGroup(params.mGroupAsName)->getGroupID(); + + ad.userData = mNxActorUserData; + + if (params.mDensity == 0 && params.mMass == 0) { + ad.body = NULL; + } + else { + bd.angularDamping = params.mAngularDamping; + bd.angularVelocity = params.mAngularVelocity; + bd.CCDMotionThreshold = params.mCCDMotionThreshold; + bd.flags = params.mBodyFlags; + bd.linearDamping = params.mLinearDamping; + bd.linearVelocity = params.mLinearVelocity; + if (ad.density == 0) + bd.mass = params.mMass; + bd.massLocalPose = params.mMassLocalPose; + bd.massSpaceInertia = params.mMassSpaceInertia; + bd.maxAngularVelocity = params.mMaxAngularVelocity; + bd.sleepAngularVelocity = params.mSleepAngularVelocity; + bd.sleepDamping = params.mSleepDamping; + bd.sleepEnergyThreshold = params.mSleepEnergyThreshold; + bd.sleepLinearVelocity = params.mSleepLinearVelocity; + bd.solverIterationCount = params.mSolverIterationCount; + bd.wakeUpCounter = params.mWakeUpCounter; + ad.body = &bd; + } + + shape->_bindToActorDescription(this, 0, ad.shapes); + + mActor = mOwner->mScene->createActor(ad); + + if (!mActor) { + std::stringstream ss; + ss << "Creation of Actor with the identifier '" << mName << "' failed." << std::endl; + NxThrow_Error(ss.str()); + return; + } + + if (!shape->isShared()) + delete shape; + + NxU32 nbShapes = mActor->getNbShapes(); + NxShape*const* shapes = mActor->getShapes(); + + int i=0; + while (nbShapes--) { + mCollisionModel[i]->_bindNxShapeToShape(shapes[nbShapes]); + i++; + } + +#if (OGRE_VERSION_MINOR >= 5) + mBirthFrame = Ogre::Root::getSingletonPtr()->getNextFrameNumber() - 1; +#else + mBirthFrame = Ogre::Root::getSingletonPtr()->getCurrentFrameNumber(); +#endif +} + +////////////////////////////////////////////////////////// + +void Actor::_destroyActor() { + mCollisionModel.destroyAllOwned(); + delete mNxActorUserData; + mOwner->mScene->releaseActor(*mActor); + mActor = 0; +} + +////////////////////////////////////////////////////////// + +void Actor::simulate(float dT) { + shapeSimulate(dT); +} + +////////////////////////////////////////////////////////// + +void Actor::render(float) { + // No. +} + +////////////////////////////////////////////////////////// + +void Actor::shapeSimulate(float t) { + for(Shape* shape = mDynamicCollisionModel.begin();shape = mDynamicCollisionModel.next();) + shape->simulate(t); +} + +////////////////////////////////////////////////////////// + +void Actor::shapeRender(float t) { + for(Shape* shape = mDynamicCollisionModel.begin();shape = mDynamicCollisionModel.next();) + shape->render(t); +} + +////////////////////////////////////////////////////////// + +void Actor::setName(NxString name) { + mOwner->mActors.rename(mName, name); + mName = name; +} + +////////////////////////////////////////////////////////// + +NxString Actor::getName() { + return mName; +} + +////////////////////////////////////////////////////////// + +NxScene* Actor::getNxScene() { + return mOwner->getNxScene(); +} + +////////////////////////////////////////////////////////// + +Actor* Actor::duplicate(const NxString& name, const Pose& p) { + Blueprints::ActorBlueprint* ab = new Blueprints::ActorBlueprint(); + ab->serialise(this, mOwner); + Actor* a = ab->unserialise(name, mOwner); + a->setGlobalPose(p); + delete ab; + return a; +} + +////////////////////////////////////////////////////////// + +void Actor::setGlobalPose(const Pose& pose) { + mActor->setGlobalPose(pose.toMat34()); +} + +////////////////////////////////////////////////////////// + +Pose Actor::getGlobalPose() { + static Pose p; + p.fromMat34(mActor->getGlobalPose()); + return p; +} + +////////////////////////////////////////////////////////// + +Ogre::Quaternion Actor::getGlobalOrientation() { + return toQuaternion(mActor->getGlobalOrientationQuat()); +} + +////////////////////////////////////////////////////////// + +void Actor::setGlobalOrientation(const Ogre::Quaternion& quat) { + mActor->setGlobalOrientation(toNxQuat(quat)); +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getGlobalPosition() { + return toVector3(mActor->getGlobalPosition()); +} + +////////////////////////////////////////////////////////// + +void Actor::setGlobalPosition(const Ogre::Vector3& vec) { + mActor->setGlobalPosition(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +void Actor::moveGlobalPose(const Pose& pose) { + mActor->moveGlobalPose(pose.toMat34()); +} + +////////////////////////////////////////////////////////// + +void Actor::moveGlobalPosition(const Ogre::Vector3& vec) { + mActor->moveGlobalPosition(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +void Actor::moveGlobalOrientation(const Ogre::Quaternion& quat) { + mActor->moveGlobalOrientationQuat(toNxQuat(quat)); +} + +//////////////////////////////////////////////////////// + +void Actor::moveTowards(const Pose& p, float force) { + NxVec3 fc = p.v - mActor->getGlobalPosition(); + fc *= force; + fc -= mActor->getPointVelocity(mActor->getGlobalPosition()); + mActor->addForceAtPos(fc, mActor->getGlobalPosition()); +} + +//////////////////////////////////////////////////////// + +#if 0 +const ShapeBlueprint& Actor::createShapeDescription(const ShapeBlueprint& s) { + NxUnderConstruction; + return s; +} + +////////////////////////////////////////////////////////// + +void Actor::destroyShapeDescription(const ShapeBlueprint&) { + NxUnderConstruction; +} + +////////////////////////////////////////////////////////// + +Ogre::uint Actor::getNbShapeDescriptions() { + return mActor->getNbShapeDescriptions(); +} + +////////////////////////////////////////////////////////// + +std::vector<const ShapeBlueprint&> Actor::getAllShapeDescriptions() { + NxUnderConstruction; + std::vector<const ShapeBlueprint&> s; + return s; +} + +////////////////////////////////////////////////////////// + +ShapeBlueprint Actor::getFirstShapeDescription() { + NxUnderConstruction; + return NULL; +} + +////////////////////////////////////////////////////////// + +ShapeBlueprint Actor::getShapeDescription(Ogre::uint id) { + NxUnderConstruction; + return NULL; +} +#endif + +////////////////////////////////////////////////////////// + +void Actor::setGroup(ActorGroup* ag) { + mActor->setGroup(ag->getGroupID()); +} + +////////////////////////////////////////////////////////// + +void Actor::setGroup(const NxString& GroupIdentifier) { + mActor->setGroup(mOwner->getActorGroups()->get(GroupIdentifier)->getGroupID()); +} + +////////////////////////////////////////////////////////// + +void Actor::setGroup(NxActorGroup agid) { + mActor->setGroup(agid); +} + +////////////////////////////////////////////////////////// + +ActorGroup* Actor::getGroup() const { + NxActorGroup agid = mActor->getGroup(); + return mOwner->getActorGroupsByIndex()->get(agid); +} + +////////////////////////////////////////////////////////// + +void Actor::raiseActorFlag(NxActorFlag f) { + mActor->raiseActorFlag(f); +} + +////////////////////////////////////////////////////////// + +void Actor::clearActorFlag(NxActorFlag f) { + mActor->clearActorFlag(f); +} + +////////////////////////////////////////////////////////// + +bool Actor::hasActorFlag(NxActorFlag f) const { + return mActor->readActorFlag(f); +} +////////////////////////////////////////////////////////// + +bool Actor::isDynamic() const { + return mActor->isDynamic(); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetLocalPose(const Pose& pose) { + mActor->setCMassOffsetLocalPose(pose.toMat34()); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetLocalPosition(const Ogre::Vector3& vec) { + mActor->setCMassOffsetLocalPosition(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetLocalOrientation(const NxMat33& m) { + mActor->setCMassOffsetLocalOrientation(m); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetLocalOrientation(const Ogre::Matrix3& vec) { + NxUnderConstruction; + +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetGlobalPose(const Pose& pose) { + mActor->setCMassOffsetGlobalPose(pose.toMat34()); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetGlobalPosition(const Ogre::Vector3& vec) { + mActor->setCMassOffsetGlobalPosition(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetGlobalOrientation(const NxMat33& m) { + mActor->setCMassOffsetGlobalOrientation(m); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassOffsetGlobalOrientation(const Ogre::Matrix3& quat) { + NxUnderConstruction; + NxMat33 m; + mActor->setCMassOffsetGlobalOrientation(m); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassGlobalPose(const Pose& pose) { + mActor->setCMassGlobalPose(pose.toMat34()); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassGlobalPosition(const Ogre::Vector3& vec) { + mActor->setCMassGlobalPosition(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +void Actor::setCMassGlobalOrientation(const Ogre::Quaternion& quat) { + NxUnderConstruction; + NxMat33 m; + mActor->setCMassGlobalOrientation(m); +} +////////////////////////////////////////////////////////// + + +Pose Actor::getCMassLocalPose() const { + Pose pose; + pose.fromMat34(mActor->getCMassLocalPose()); + return pose; +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getCMassLocalPosition() const { + return toVector3(mActor->getCMassLocalPosition()); +} + +////////////////////////////////////////////////////////// + +Ogre::Quaternion Actor::getCMassLocalOrientation() const { + return toQuaternion(mActor->getCMassLocalOrientation()); +} + +////////////////////////////////////////////////////////// + +Pose Actor::getCMassGlobalPose() const { + Pose pose; + pose.fromMat34(mActor->getCMassGlobalPose()); + return pose; +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getCMassGlobalPosition() const { + return toVector3(mActor->getCMassGlobalPosition()); +} + +////////////////////////////////////////////////////////// + +Ogre::Quaternion Actor::getCMassGlobalOrientation() const { + NxQuat quat; + mActor->getCMassGlobalOrientation().toQuat(quat); + return toQuaternion(quat); +} + +////////////////////////////////////////////////////////// + + +void Actor::setMass(NxReal r) { + mActor->setMass(r); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getMass() const { + return mActor->getMass(); +} + +////////////////////////////////////////////////////////// + + +void Actor::setMassSpaceInertiaTensor(const Ogre::Vector3& vec) { + mActor->setMassSpaceInertiaTensor(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getMassSpaceInertiaTensor() const { + return toVector3(mActor->getMassSpaceInertiaTensor()); +} + +////////////////////////////////////////////////////////// + +Ogre::Matrix3 Actor::getGlobalInertiaTensor() const { + NxUnderConstruction; + Ogre::Matrix3 m; + return m; +} + +////////////////////////////////////////////////////////// + +Ogre::Matrix3 Actor::getGlobalInertiaTensorInverse() const { + NxUnderConstruction; + Ogre::Matrix3 m; + return m; +} + +////////////////////////////////////////////////////////// + + +void Actor::updateMassFromShapeFromDensity(NxReal r) { + mActor->updateMassFromShapes(r,0); +} + +////////////////////////////////////////////////////////// + +void Actor::updateMassFromShapeAsMass(NxReal r) { + mActor->updateMassFromShapes(0,r); +} + +////////////////////////////////////////////////////////// + +void Actor::setLinearDamping(NxReal r) { + mActor->setLinearDamping(r); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getLinearDamping() const { + return mActor->getLinearDamping(); +} + +////////////////////////////////////////////////////////// + + +void Actor::setAngularDamping(NxReal r) { + mActor->setAngularDamping(r); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getAngularDamping() const { + return mActor->getAngularDamping(); +} + +////////////////////////////////////////////////////////// + +void Actor::setLinearVelocity(const Ogre::Vector3& vec) { + mActor->setLinearVelocity(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +void Actor::setAngularVelocity(const Ogre::Vector3& vec) { + mActor->setAngularVelocity(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + + +Ogre::Vector3 Actor::getLinearVelocity() const { + return toVector3(mActor->getLinearVelocity()); +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getAngularVelocity() const { + return toVector3(mActor->getAngularVelocity()); +} + +////////////////////////////////////////////////////////// + + +void Actor::setMaxAngularVelocity(NxReal r) { + mActor->setMaxAngularVelocity(r); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getMaxAngularVelocity() const { + return mActor->getMaxAngularVelocity(); +} + +////////////////////////////////////////////////////////// + +void Actor::setCCDMotionThreshold(NxReal r) { + mActor->setCCDMotionThreshold(r); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getCCDMotionThreshold() const { + return mActor->getCCDMotionThreshold(); +} + +////////////////////////////////////////////////////////// + +void Actor::setLinearMomentum(const Ogre::Vector3& vec) { + mActor->setLinearMomentum(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +void Actor::setAngularMomentum(const Ogre::Vector3& vec) { + mActor->setAngularMomentum(toNxVec3(vec)); +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getLinearMomentum() const { + return toVector3(mActor->getLinearMomentum()); +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getAngularMomentum() const { + return toVector3(mActor->getAngularMomentum()); +} + +////////////////////////////////////////////////////////// + +void Actor::addForceAtPos(const Ogre::Vector3& force, const Ogre::Vector3& pos, NxForceMode mode, bool wakeup) { + mActor->addForceAtPos(toNxVec3(force), toNxVec3(pos), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +void Actor::addForceAtLocalPos(const Ogre::Vector3& force, const Ogre::Vector3& pos, NxForceMode mode, bool wakeup) { + mActor->addForceAtLocalPos(toNxVec3(force), toNxVec3(pos), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +void Actor::addLocalForceAtPos(const Ogre::Vector3& force, const Ogre::Vector3& pos, NxForceMode mode, bool wakeup) { + mActor->addLocalForceAtPos(toNxVec3(force), toNxVec3(pos), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +void Actor::addLocalForceAtLocalPos(const Ogre::Vector3& force, const Ogre::Vector3& pos, NxForceMode mode, bool wakeup) { + mActor->addLocalForceAtLocalPos(toNxVec3(force), toNxVec3(pos), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +void Actor::addForce(const Ogre::Vector3& force, NxForceMode mode, bool wakeup) { + mActor->addForce(toNxVec3(force), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +void Actor::addLocalForce(const Ogre::Vector3& force, NxForceMode mode, bool wakeup) { + mActor->addLocalForce(toNxVec3(force), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +void Actor::addTorque(const Ogre::Vector3& torque, NxForceMode mode, bool wakeup) { + mActor->addTorque(toNxVec3(torque), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +void Actor::addLocalTorque(const Ogre::Vector3& torque, NxForceMode mode, bool wakeup) { + mActor->addLocalTorque(toNxVec3(torque), mode, wakeup); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::computeKineticEnergy() const { + return mActor->computeKineticEnergy(); +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getPointVelocity(const Ogre::Vector3& vec) const { + return toVector3(mActor->getPointVelocity(toNxVec3(vec))); +} + +////////////////////////////////////////////////////////// + +Ogre::Vector3 Actor::getLocalPointVelocity(const Ogre::Vector3& vec) const { + return toVector3(mActor->getLocalPointVelocity(toNxVec3(vec))); +} + +////////////////////////////////////////////////////////// + +bool Actor::isGroupSleeping() const { + return mActor->isGroupSleeping(); +} + +////////////////////////////////////////////////////////// + +bool Actor::isSleeping() const { + return mActor->isSleeping(); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getSleepLinearVelocity() const { + return mActor->getSleepLinearVelocity(); +} + +////////////////////////////////////////////////////////// + +void Actor::setSleepLinearVelocity(NxReal threshold) { + mActor->setSleepLinearVelocity(threshold); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getSleepAngularVelocity() const { + return mActor->getSleepAngularVelocity(); +} + +////////////////////////////////////////////////////////// + +void Actor::setSleepAngularVelocity(NxReal threshold) { + mActor->setSleepAngularVelocity(threshold); +} + +////////////////////////////////////////////////////////// + +NxReal Actor::getSleepEnergyThreshold() const { + return mActor->getSleepEnergyThreshold(); +} + +////////////////////////////////////////////////////////// + +void Actor::setSleepEnergyThreshold(NxReal threshold) { + mActor->setSleepEnergyThreshold(threshold); +} + +////////////////////////////////////////////////////////// + +void Actor::wakeUp(NxReal wakeCounterValue) { + mActor->wakeUp(wakeCounterValue); +} + +////////////////////////////////////////////////////////// + +void Actor::putToSleep() { + mActor->putToSleep(); +} + +////////////////////////////////////////////////////////// + +void Actor::raiseBodyFlag(NxBodyFlag f) { + mActor->raiseBodyFlag(f); +} + +////////////////////////////////////////////////////////// + +void Actor::clearBodyFlag(NxBodyFlag f) { + mActor->clearBodyFlag(f); +} + +////////////////////////////////////////////////////////// + +bool Actor::hasBodyFlag(NxBodyFlag f) const { + return mActor->readBodyFlag(f); +} + +////////////////////////////////////////////////////////// + +void Actor::setSolverIterationCount(NxU32 c) { + mActor->setSolverIterationCount(c); +} + +////////////////////////////////////////////////////////// + +NxU32 Actor::getSolverIterationCount() const { + return mActor->getSolverIterationCount(); +} + +////////////////////////////////////////////////////////// + +#if NX_SUPPORT_SWEEP_API + +NxU32 Actor::linearSweep(const Ogre::Vector3& motion, NxU32 flags, void* userData, NxU32 nbShapeDescriptions, NxSweepQueryHit* shapes, NxUserEntityReport<NxSweepQueryHit>* callback, const NxSweepCache* sweepCache) { + return mActor->linearSweep(toNxVec3(motion), flags, userData, nbShapeDescriptions, shapes, callback, sweepCache); +} + +#endif + +////////////////////////////////////////////////////////// + +#if NX_SDK_VERSION_NUMBER >= 260 + +Compartment* Actor::getCompartment() const { + NxUnderConstruction; + return NULL; +} + +#endif + +////////////////////////////////////////////////////////// + +Shape* Actor::addShape(ShapeBlueprint* sd) { + + + NxShapeIndex id = mCollisionModel.count(); + sd->_bindToNxActor(this, id); + delete sd; + Shape* s = mCollisionModel.get(id); + + + return s; + +} + +////////////////////////////////////////////////////////// + +void Actor::removeShape(Shape* sh) { + + + for (Shape* shape = mCollisionModel.begin();shape = mCollisionModel.next();) { + if (shape == sh) { + mActor->releaseShape(*sh->getNxShape()); + mCollisionModel.remove(sh->getIndex()); + + if (mDynamicCollisionModel.has(sh->getIndex())) + mDynamicCollisionModel.remove(sh->getIndex()); + + delete shape; + + return; + } + } + +} + +////////////////////////////////////////////////////////// + +void Actor::removeShape(NxShapeIndex id) { + + Shape* shape = mCollisionModel[id]; + + if (shape == 0) + return; + + shape->releaseShape(); + mCollisionModel.remove(id); + + delete shape; +} + +////////////////////////////////////////////////////////// + +NxU32 Actor::getNbShapes() const { + return mCollisionModel.count(); +} + +////////////////////////////////////////////////////////// + +CollisionModel* Actor::getCollisionModel() { + return &mCollisionModel; +} + +////////////////////////////////////////////////////////// + +CollisionModel* Actor::getDynamicCollisionModel() { + return &mDynamicCollisionModel; +} + +////////////////////////////////////////////////////////// + +void* Actor::getNxActorUserData() { + return mActor->userData; +} + +////////////////////////////////////////////////////////// + +StringPairList Actor::saveCustom() { + StringPairList l; + l.insert("ActorType", "Actor"); + + return l; +} + +////////////////////////////////////////////////////////// + +void Actor::disable() { + mActor->raiseActorFlag(NX_AF_DISABLE_COLLISION); + mActor->raiseActorFlag(NX_AF_DISABLE_RESPONSE); + mActor->raiseActorFlag(NX_AF_FLUID_DISABLE_COLLISION); + mActor->raiseBodyFlag(NX_BF_FROZEN); + mActor->raiseBodyFlag(NX_BF_FROZEN_ROT); + mActor->setAngularVelocity(NxVec3(0,0,0)); + mActor->setAngularMomentum(NxVec3(0,0,0)); + mActor->setLinearMomentum(NxVec3(0,0,0)); + mActor->setLinearVelocity(NxVec3(0,0,0)); + + disableVisualisation(); +} + +////////////////////////////////////////////////////////// + +FixedJoint* Actor::joinWith(Actor* actorB, JointParams jp) { + return mOwner->createFixedJoint(this, actorB, jp); +} + +////////////////////////////////////////////////////////// + +} //End of NxOgre namespace. Added: trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.h =================================================================== --- trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.h (rev 0) +++ trunk/python-ogre/ThirdParty/nxogre/NxOgreActor.h 2007-10-14 07:54:01 UTC (rev 422) @@ -0,0 +1,734 @@ +// +// NxOgre a wrapper for the PhysX (formerly Novodex) physics library and the Ogre 3D rendering engine. +// Copyright (C) 2005 - 2007 Robin Southern and NxOgre.org http://www.nxogre.org +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#ifndef __NXOGRE_ACTOR_H__ +#define __NXOGRE_ACTOR_H__ + +#include "NxOgrePrerequisites.h" +#include "NxOgreContainer.h" // For: mCollisionList +#include "NxOgreParams.h" + +namespace NxOgre { + + /** + \page actorparams ActorParams + + String base params are case and space insensitive. + + Examples: + + <code> + "mass: 1" + + "mass: 1, group: myActors" + + "mass: 1, group: myActors, lineardamping: 3" + </code> + + Non-String based params can be used as well, and offer access to some variables of the params + that cannot be converted into a string (pointers, etc.). + + Due to efficency purposes and insane string conversion. With string parameters more than four, + you should work with the non-string based params system. + + <code> + ActorParams params; + params.setToDefault(); + params.mMass = 10; + params.mGroupAsIndex = 1; + </code> + + Is exactly the same as: + + <code> + "mass: 10, group-index: 1" + </code> + + Current Supported String Params + ----------------------------- + + - density (float) + - Description: Density of this Actor. Use this or mass, do not use both. + - Example: "Density: 1.5" + - See: ActorParams::mDensity and NxActorDesc::density for more information. + + - group (string) + - Description: Actor Group name of this actor. Use this or group-index, but not both. + - Example: "group: myGroup" + - See: ActorParams::mGroupAsName + + - group-index (unsigned int) + - Description: Actor Group ID of this actor. Use this or group, but not both. + - Example: "group-index: 0" + - See: ActorParams::mGroupAsIndex + + - dominancegroup (unsigned int) + - Description: Dominance Group ID of this actor. + - Example: "dominancegroup: 0" + - See: ActorParams::mDominanceGroup + + - massspaceinertia (Vector3) + - Description: Mass Space Inertia of this Actor + - Example: "massspaceinertia: 1 0 1" + - See: ActorParams::mMassSpaceInertia + + - linearvelocity (Vector3) + - Description: Linear Velocity of this Actor + - Example: "linearvelocity: 1 0 1" + - See: ActorParams::mLinearVelocity + + - angularvelocity (Vector3) + - Description: Angular Velocity of this Actor + - Example: "angularvelocity: 1 0 1" + - See: ActorParams::mAngularVelocity + + - wakeupcounter (float) + - Description: Wake up time counter + - Example: "wakeupcounter: 1000.0" + - See: ActorParams::mWakeupCounter + + - mass (float) + - Description: Mass of this Actor. Use this or density, do not use both. + - Example: "mass: 10" + - See: ActorParams::mMass and NxBodyDesc::mass for more information. + + - lineardamping (float) + - Description: Linear Damping of the Actor + - Example: "lineardamping: 0.1" + - See: ActorParams::mLinearDamping + + - angulardamping (float) + - Description: Angular Damping of the Actor + - Example: "angulardamping: 0.1" + - See: ActorParams::mAngularDamping + + - maxangularvelocity (float) + - Description: Maximum allowed angular velocity + - Example: "maxangularvelocity: 10" + - See: ActorParams::mMaxAngularVelocity + + - sleepangularvelocity (float) + - Description: Maximum angular velocity at which the Actor can go to sleep. + - Example: "sleepangularvelocity: 20" + - See: ActorParams:mSleepAngularVelocity + + - ccdmotionthreshold (float) + - Description: When CCD is globally enabled, it is still not performed if the + motion distance of all points on the Actor is below this threshold. + - Example: "ccdmotionthreshold: 5" + - See: ActorParams::mCCDMotionThreshold + + - solveriterationcount (unsigned int) + - Description: Number of solver iterations performed when processing joint/contacts + connected to this Actor. + - Example: "solveriterationcount: 5" + - Range: 1 to 255 + - See: ActorParams::mSolverIterationCount + + - sleepenergytheshold (float) + - Description: Threshold for the energy-based sleeping algorithm. Only used when + the NX_BF_ENERGY_SLEEP_TEST flag is set + - Example: "sleepenergythreshold: 0.006" + - See: ActorParams::mSleepEnergyThreshold + + - sleepdamping (float) + - Description: Damping factor for bodies that are about to sleep. + - Example: "sleepdamping: 0.5" + - See: ActorParams::mSleepDamping + + - node-scale (Vector3) + - Applicable to Body and Actors that use a visual representation of the NxActor. + - Description: Scale factor of the SceneNode + - Example: "node-slace: 2 2 2" + - See: ActorParams::mNodeScale + + - node-shadows (bool) + - Applicable to Body and Actors that use a visual representation of the NxActor. + - Description: Apply shadows to the first entity (Body class). See other custom Actors + to see how shadows apply to it. + - Example: "node-shadows: yes" + - See: ActorParams::mNodeShaodws + + - node (string) + - Applicable to Body and Actors that use a visual representation of the NxActor. + - Description: Name of the SceneNode, or name of an existing SceneNode to use (Body only). + - Example: "node: myNodeName" + - See: ActorParams::mNodeName + + */ + + /** ActorParams + + See \ref actorparams for the full string argument documentation. + */ + class NxExport ActorParams : public Params { + + public: + + + ActorParams(){setToDefault();} + ActorParams(const char* p) {process(p);} + ActorParams(NxString p) {process(p);} + + void setToDefault(); + void parse(Parameters); + void fromNxActorDesc(NxActorDesc&); + void fromNxBodyDesc(NxBodyDesc&); + + //////////////////////////////////////////////////////////////// + +#if NX_SDK_VERSION_NUMBER >= 260 + /// NxCompartment of the Actor to sit in. + /// @todo NxOgre-ify + /// @default NULL + NxCompartment* mCompartment; +#endif + + /// Density, mass must be 0 when density is used. + NxReal mDensity; + +#if NX_SDK_VERSION_NUMBER >= 272 + + /// DominanceGroup (as Name). + /// @default "" + NxString mDominanceGroupAsName; + + /// DominanceGroup (as Index) + /// @default 0 + NxDominanceGroup mDominanceGroupAsIndex; +#endif + + /// Flags for the NxActor + /// @see NxActorFlags + /// @default 0 + NxU32 mActorFlags; + + + /// Group to use as index. GroupAsName must be blank. + /// @default 0 + NxActorGroup mGroupAsIndex; + + + /// Group to use from name. GroupAsIndex must be 0. + /// @default Blank String + NxString mGroupAsName; + + + //////////////////////////////////////////////////////////////// + + + /// Angular Damping + NxReal mAngularDamping; + + + /// Angular Velocity + NxVec3 mAngularVelocity; + + + /// + NxReal mCCDMotionThreshold; + + + /// + NxU32 mBodyFlags; + + + /// + NxReal mLinearDamping; + + + /// + NxVec3 mLinearVelocity; + + + /// Mass of the Actor. When used, make sure density is zero. + NxReal mMass; + + + /// + NxMat34 mMassLocalPose; + + /// + NxVec3 mMassSpaceInertia; + + + /// + NxReal mMaxAngularVelocity; + + /// + NxReal mSleepAngularVelocity; + + + /// + NxReal mSleepDamping; + + + /// + NxReal mSleepEnergyThreshold; + + + /// + NxReal mSleepLinearVelocity; + + + /// + NxU32 mSolverIterationCount; + + + /// + NxReal mWakeUpCounter; + + + //////////////////////////////////////////////////////////////// + + + /// SceneNode for Visual based Actors. If the node already exists then it will use it. + NxString mNodeName; + + /// Scale the SceneNode for Visual based Actors + Ogre::Vector3 mNodeScale; + + /// Set the first Entity of the Visual based Actors to have shadows or not. + bool mNodeShadows; + + + + }; // End of ActorParams class + + class NxExport Actor { + + public: + + Actor(const NxString& Identifier, Scene*, bool is... [truncated message content] |
From: <and...@us...> - 2007-10-14 04:33:48
|
Revision: 421 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=421&view=rev Author: andy_miller Date: 2007-10-13 21:33:53 -0700 (Sat, 13 Oct 2007) Log Message: ----------- linux fix Modified Paths: -------------- trunk/python-ogre/code_generators/common_utils/extract_documentation.py Modified: trunk/python-ogre/code_generators/common_utils/extract_documentation.py =================================================================== --- trunk/python-ogre/code_generators/common_utils/extract_documentation.py 2007-10-14 04:33:28 UTC (rev 420) +++ trunk/python-ogre/code_generators/common_utils/extract_documentation.py 2007-10-14 04:33:53 UTC (rev 421) @@ -203,6 +203,7 @@ _str = clean(_str, "@code", "::") # using literal code blocks # _str = clean(_str, "@par", "") ## it will get a single blank line by default -- breaks @param... + _str = clean(_str, "\r\n", "\\n") ## for linux build _str = clean(_str, "\\par", "") ## it will get a single blank line by default _str = clean(_str, "\n", "\\n") _str = clean(_str, "\\p", "") ## cegui comments @@ -245,4 +246,4 @@ print doc_extractor("")(x_decl("myfunc(int x, int y)","c:/development/ocvs/ogrenew/ogremain/include/OgreSceneManager.h",218)) print doc_extractor("")(x_decl("","c:/development/ocvs/ogrenew/ogremain/include/OgreSceneManager.h",223)) - print doc_extractor("")(x_decl("","c:/development/CEGUI-0.5.0/include/CEGUIEvent.h",139)) \ No newline at end of file + print doc_extractor("")(x_decl("","c:/development/CEGUI-0.5.0/include/CEGUIEvent.h",139)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-14 04:33:24
|
Revision: 420 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=420&view=rev Author: andy_miller Date: 2007-10-13 21:33:28 -0700 (Sat, 13 Oct 2007) Log Message: ----------- script updates Modified Paths: -------------- trunk/python-ogre/scripts/01-RetrieveSource.sh trunk/python-ogre/scripts/03-BuildTools.sh trunk/python-ogre/scripts/06-GenerateCode.sh trunk/python-ogre/scripts/07-BuildModules.sh Modified: trunk/python-ogre/scripts/01-RetrieveSource.sh =================================================================== --- trunk/python-ogre/scripts/01-RetrieveSource.sh 2007-10-14 04:06:09 UTC (rev 419) +++ trunk/python-ogre/scripts/01-RetrieveSource.sh 2007-10-14 04:33:28 UTC (rev 420) @@ -16,7 +16,7 @@ $WGET http://prdownloads.sourceforge.net/crayzedsgui/CEGUI-0.5.0b.tar.gz $WGET http://prdownloads.sourceforge.net/wgois/ois-1.0RC1.tar.gz $WGET http://prdownloads.sourceforge.net/boost/boost-jam-3.1.13-1-linuxx86.tgz -$WGET http://prdownloads.sourceforge.net/scons/scons-0.96.96.tar.gz +##$WGET http://prdownloads.sourceforge.net/scons/scons-0.96.96.tar.gz $WGET http://downloads.sourceforge.net/scons/scons-0.97.0d20070918.tar.gz $WGET http://prdownloads.sourceforge.net/ogre/ogre-linux_osx-v1-4-5.tar.bz2 $WGET http://prdownloads.sourceforge.net/opende/ode-src-0.8.zip @@ -39,6 +39,8 @@ cvs -z3 -q -d :pserver:ano...@cv...:/cvsroot/ogre co -P ogreaddons/ogreode echo " -- getting ogrenewt" cvs -z3 -q -d :pserver:ano...@cv...:/cvsroot/ogre co -P ogreaddons/ogrenewt +echo " -- getting nxogre" +svn co http://latest.nxogre.org/nxogre3/ nxogre echo "" echo "======= Sources Retrieved =======" echo "" Modified: trunk/python-ogre/scripts/03-BuildTools.sh =================================================================== --- trunk/python-ogre/scripts/03-BuildTools.sh 2007-10-14 04:06:09 UTC (rev 419) +++ trunk/python-ogre/scripts/03-BuildTools.sh 2007-10-14 04:33:28 UTC (rev 420) @@ -43,18 +43,18 @@ cd $INSTALL_DIR ## Scons -echo " -- installing SCONs" -rm -rf scons-0.96.96 -tar -xvzf $DOWNLOADS/scons-0.96.96.tar.gz --overwrite -cd scons-0.96.96 -python setup.py install --prefix=$PREFIX -cd .. +#echo " -- installing SCONs" +#rm -rf scons-0.96.96 +#tar -xvzf $DOWNLOADS/scons-0.96.96.tar.gz --overwrite +#cd scons-0.96.96 +#python setup.py install --prefix=$PREFIX +#cd .. echo " -- installing SCONs" rm -rf scons-0.97.0d20070918 tar -xvzf $DOWNLOADS/scons-0.97.0d20070918.tar.gz --overwrite cd scons-0.97.0d20070918 -####python setup.py install --prefix=$PREFIX +python setup.py install --prefix=$PREFIX cd .. Modified: trunk/python-ogre/scripts/06-GenerateCode.sh =================================================================== --- trunk/python-ogre/scripts/06-GenerateCode.sh 2007-10-14 04:06:09 UTC (rev 419) +++ trunk/python-ogre/scripts/06-GenerateCode.sh 2007-10-14 04:33:28 UTC (rev 420) @@ -3,7 +3,6 @@ # master config setup source ./config.sh -cd python-ogre/code_generators if [ $1 != "" ] then echo "=== generating $1 ===" @@ -11,13 +10,13 @@ $INSTALL_DIR/gen_code.sh $1 else -# echo ' -- creating OGRE code' -# echo ' -- creating OGRE code' >> $INSTALL_DIR/log.out -# $INSTALL_DIR/gen_code.sh ogre + echo ' -- creating OGRE code' + echo ' -- creating OGRE code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ogre -# echo ' -- creating OGRErefapp code' -# echo ' -- creating OGRErefapp code'>> $INSTALL_DIR/log.out -# $INSTALL_DIR/gen_code.sh ogrerefapp + echo ' -- creating OGRErefapp code' + echo ' -- creating OGRErefapp code'>> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ogrerefapp echo ' -- creating quickgui code' echo ' -- creating quickgui code'>> $INSTALL_DIR/log.out @@ -27,9 +26,9 @@ echo ' -- creating OIS code'>> $INSTALL_DIR/log.out $INSTALL_DIR/gen_code.sh ois -# echo ' -- creating CEGUI code' -# echo ' -- creating CEGUI code'>> $INSTALL_DIR/log.out -# $INSTALL_DIR/gen_code.sh cegui + echo ' -- creating CEGUI code' + echo ' -- creating CEGUI code'>> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh cegui echo ' -- creating OgreAL code' echo ' -- creating OgreAL code'>> $INSTALL_DIR/log.out @@ -55,14 +54,30 @@ echo ' -- creating ode code' >> $INSTALL_DIR/log.out $INSTALL_DIR/gen_code.sh ode -# echo ' -- creating et code' -# echo ' -- creating et code' >> $INSTALL_DIR/log.out -# $INSTALL_DIR/gen_code.sh et + echo ' -- creating et code' + echo ' -- creating et code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh et -# echo ' -- creating caelum code' -# echo ' -- creating caelum code' >> $INSTALL_DIR/log.out -# $INSTALL_DIR/gen_code.sh caelum + echo ' -- creating caelum code' + echo ' -- creating caelum code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh caelum + echo ' -- creating forests code' + echo ' -- creating forests code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh forests + + echo ' -- creating ogrebulletc code ' + echo ' -- creating ogrebulletc code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ogrebulletc + + echo ' -- creating ogrebulletd code ' + echo ' -- creating ogrebulletd code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ogrebulletd + +# echo ' -- creating nxogre code ' +# echo ' -- creating nxogre code' >> $INSTALL_DIR/log.out +# $INSTALL_DIR/gen_code.sh nxogre + fi cd $INSTALL_DIR echo Modified: trunk/python-ogre/scripts/07-BuildModules.sh =================================================================== --- trunk/python-ogre/scripts/07-BuildModules.sh 2007-10-14 04:06:09 UTC (rev 419) +++ trunk/python-ogre/scripts/07-BuildModules.sh 2007-10-14 04:33:28 UTC (rev 420) @@ -12,7 +12,7 @@ then scons PROJECTS=$1 else - scons PROJECTS=ogre,ois,cegui,plib,ogreode,ogrenewt,ogreal,quickgui,et,caelum + scons PROJECTS=ogre,ois,cegui,plib,ogreode,ogrenewt,ogreal,quickgui,et,caelum -i fi #opcode -- not really suited to a linux build -- lots of work needed ? # This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-14 04:06:06
|
Revision: 419 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=419&view=rev Author: andy_miller Date: 2007-10-13 21:06:09 -0700 (Sat, 13 Oct 2007) Log Message: ----------- Cleaned Config files Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_nt.py trunk/python-ogre/PythonOgreConfig_posix.py Modified: trunk/python-ogre/PythonOgreConfig_nt.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-14 03:35:28 UTC (rev 418) +++ trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-14 04:06:09 UTC (rev 419) @@ -54,8 +54,6 @@ PATH_ffmpeg= os.path.join(BASE_DIR, 'ffmpeg') PATH_navi = os.path.join(BASE_DIR, 'navi','Navi') - -# # it's time for the SDK version if SDK: PATH_CEGUI = os.path.join(BASE_DIR, 'Ogrenew') @@ -88,9 +86,9 @@ PATH_LIB_Theora= os.path.join(PATH_Theora, 'bin', 'Release') PATH_LIB_ogrevideoffmpeg = PATH_ogrevideoffmpeg PATH_LIB_ffmpeg= os.path.join(PATH_ffmpeg, 'lib') -PATH_LIB_ogredshow = PATH_ogredshow PATH_LIB_plib = PATH_plib PATH_LIB_navi= os.path.join(PATH_navi, 'lib') +PATH_LIB_ogredshow = PATH_ogredshow if SDK: PATH_LIB_Ogre_CEGUIRenderer = os.path.join( PATH_Ogre, 'lib') Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-14 03:35:28 UTC (rev 418) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-14 04:06:09 UTC (rev 419) @@ -1,26 +1,23 @@ import sys,os -## Boost stuff -## path to the root of your boost dir, should have 'libs', 'boost' subdirectories +## The root directory is where this module is located module_dir = os.path.abspath(os.path.dirname(__file__) )## The root directory is where this module is located ## lets assume that the base development directory is one level higher BASE_DIR,ignore = os.path.split(module_dir) ## r'/home/andy/development' +# the base of the /usr/... dircetory structure that we are using ROOT_DIR = os.path.join(BASE_DIR,'root') -root_dir = os.path.abspath(os.path.dirname(__file__) )## The root directory is where this module is located - LOCAL_LIB = os.path.join(ROOT_DIR,'usr/lib') LOCAL_INCLUDE = os.path.join(ROOT_DIR, 'usr/include') +## path to the root of your boost dir, should have 'libs', 'boost' subdirectories PATH_Boost = os.path.join(LOCAL_INCLUDE, 'boost-1_34') - -# +## Path to your boost_pythonxxxx lib file PATH_LIB_Boost = LOCAL_LIB ## and the name of the boost python library LIB_Boost = 'libboost_python-gcc41-1_34' -# -# Don't forget we need to call gccxml...... +# We need to know where to find gccxml...... gccxml_bin = os.path.join(BASE_DIR,'gccxml-build/bin') # and the Py++ directory as sometimes we need access to the code repository there pyplusplus_install_dir = os.path.join(BASE_DIR,'pygccxml') @@ -39,9 +36,11 @@ PATH_OPENAL= os.path.join(BASE_DIR, 'openal-0.0.8') PATH_ALUT= os.path.join(BASE_DIR, 'freealut-1.1.0') PATH_OgreOde= os.path.join(PATH_OgreAddons,'ogreode') -PATH_OgreBullet= os.path.join(PATH_OgreAddons,'ogrebullet') -PATH_ogreforests= os.path.join(PATH_OgreAddons,'forests') +# PATH_OgreBullet= os.path.join(PATH_OgreAddons,'ogrebullet') +# PATH_ogreforests= os.path.join(PATH_OgreAddons,'forests') +PATH_OgreBullet= os.path.join(PATH_THIRDPARTY,'ogrebullet') +PATH_ogreforests= os.path.join(PATH_THIRDPARTY,'forests') PATH_OGREAL= os.path.join(PATH_THIRDPARTY,'ogreal') PATH_OPCODE= os.path.join(PATH_THIRDPARTY,'opcode') PATH_quickgui= os.path.join(PATH_THIRDPARTY,'quickgui') @@ -75,21 +74,20 @@ PATH_LIB_ODE = os.path.join( LOCAL_LIB ) #PATH_ODE, 'lib/releasedll')## probable releaselib for posix PATH_LIB_OPCODE = os.path.join( PATH_OPCODE ) PATH_LIB_OgreOde = os.path.join( LOCAL_LIB ) #PATH_OgreOde, 'lib/Release') +# PATH_LIB_OgreBullet = os.path.join( PATH_OgreBullet, 'lib/Release') PATH_LIB_OgreOdePrefab = os.path.join( LOCAL_LIB ) #PATH_OgreOde, 'prefab/lib/Release' ) PATH_LIB_OgreOdeLoader = os.path.join( LOCAL_LIB ) #PATH_OgreOde, 'loader/lib/Release' ) PATH_LIB_OgreAL = os.path.join( LOCAL_LIB ) #PATH_OGREAL, 'lib/Release' ) PATH_LIB_betagui = PATH_betagui -PATH_LIB_OgreBullet = os.path.join( PATH_OgreBullet, 'lib/Release') - PATH_LIB_quickgui = PATH_quickgui -PATH_LIB_Bullet = os.path.join( LOCAL_LIB ) -PATH_LIB_plib = PATH_plib -PATH_LIB_navi= os.path.join(PATH_navi, 'lib') PATH_LIB_NxOgre= os.path.join(LOCAL_LIB ) PATH_LIB_PhysX = os.path.join(LOCAL_LIB) +PATH_LIB_Bullet = os.path.join( LOCAL_LIB ) PATH_LIB_Theora= os.path.join(PATH_Theora, 'bin', 'Release') PATH_LIB_ogrevideoffmpeg = PATH_ogrevideoffmpeg PATH_LIB_ffmpeg= os.path.join(PATH_ffmpeg, 'lib') +PATH_LIB_plib = PATH_plib +PATH_LIB_navi= os.path.join(PATH_navi, 'lib') PATH_INCLUDE_Ogre= os.path.join(LOCAL_INCLUDE,'OGRE') # os.path.join(PATH_Ogre,'OgreMain/include') @@ -99,35 +97,36 @@ PATH_INCLUDE_OgreNewt = os.path.join(LOCAL_INCLUDE,'OgreNewt') #os.path.join(PATH_OgreAddons,'ogrenewt/OgreNewt_Main/inc') PATH_INCLUDE_CEGUI = os.path.join(LOCAL_INCLUDE,'CEGUI') #os.path.join(PATH_CEGUI, r'include/CEGUI') PATH_INCLUDE_ODE = os.path.join(LOCAL_INCLUDE,'ode') #os.path.join( PATH_ODE, 'include') +PATH_INCLUDE_OPCODE = PATH_OPCODE PATH_INCLUDE_ODESOURCE = '' # os.path.join( PATH_ODE, 'ode/src') -PATH_INCLUDE_quickgui = PATH_quickgui PATH_INCLUDE_OgreAL = PATH_OGREAL PATH_INCLUDE_OPENAL = os.path.join( LOCAL_INCLUDE ) #os.path.join( PATH_OPENAL, 'include') PATH_INCLUDE_OGG= os.path.join( LOCAL_INCLUDE,'ogg' ) #os.path.join( PATH_OGG, 'include' ) PATH_INCLUDE_VORBIS= os.path.join( LOCAL_INCLUDE,'vorbis' ) #os.path.join( PATH_VORBIS, 'include' ) PATH_INCLUDE_ALUT= os.path.join( LOCAL_INCLUDE ) #os.path.join( PATH_ALUT, 'include' ) + +# PATH_INCLUDE_OgreBullet = [ +# os.path.join( PATH_OgreBullet,'Collisions','include') +# ,os.path.join( PATH_OgreBullet,'Dynamics','include') +# ] + + PATH_INCLUDE_OgreOde = os.path.join( PATH_OgreOde,'include') PATH_INCLUDE_OgreOdePrefab= os.path.join( PATH_OgreOde,'prefab/include') PATH_INCLUDE_OgreOdeLoader= os.path.join( PATH_OgreOde,'loader/include') -PATH_INCLUDE_OgreBullet = [ - os.path.join( PATH_OgreBullet,'Collisions','include') - ,os.path.join( PATH_OgreBullet,'Dynamics','include') - ] +PATH_INCLUDE_FMOD = "" +PATH_INCLUDE_Ogre_CEGUIRenderer = os.path.join( PATH_Ogre, 'Samples/Common/CEGUIRenderer/include') +PATH_INCLUDE_quickgui = PATH_quickgui PATH_INCLUDE_NxOgre= os.path.join(PATH_NxOgre, 'include') -PATH_INCLUDE_betagui = PATH_betagui -PATH_INCLUDE_Ogre_CEGUIRenderer = os.path.join( PATH_Ogre, 'Samples/Common/CEGUIRenderer/include') -PATH_INCLUDE_OPCODE = os.path.join( PATH_OPCODE ) PATH_INCLUDE_Bullet = os.path.join( LOCAL_INCLUDE ) -PATH_INCLUDE_navi = os.path.join (PATH_navi,'include') -PATH_INCLUDE_plib = PATH_plib -PATH_INCLUDE_ogredshow = PATH_ogredshow -PATH_INCLUDE_ogreforests = os.path.join (PATH_ogreforests,'include') - +PATH_INCLUDE_betagui = PATH_betagui PATH_INCLUDE_Theora = os.path.join (PATH_Theora,'include') PATH_INCLUDE_ogrevideoffmpeg = PATH_ogrevideoffmpeg PATH_INCLUDE_ffmpeg = os.path.join (PATH_ffmpeg,'include') PATH_INCLUDE_plib = PATH_plib PATH_INCLUDE_navi = os.path.join (PATH_navi,'include') +PATH_INCLUDE_ogredshow = PATH_ogredshow +PATH_INCLUDE_ogreforests = PATH_ogreforests PATH_INCLUDE_OggVorbisTheora = [ os.path.join(BASE_DIR,'ogg','include') ,os.path.join(BASE_DIR, 'vorbis', 'include') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-14 03:35:26
|
Revision: 418 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=418&view=rev Author: andy_miller Date: 2007-10-13 20:35:28 -0700 (Sat, 13 Oct 2007) Log Message: ----------- missing script Added Paths: ----------- trunk/python-ogre/scripts/gen_code.sh Added: trunk/python-ogre/scripts/gen_code.sh =================================================================== --- trunk/python-ogre/scripts/gen_code.sh (rev 0) +++ trunk/python-ogre/scripts/gen_code.sh 2007-10-14 03:35:28 UTC (rev 418) @@ -0,0 +1,8 @@ +#!/bin/bash +# Part of the Python-Ogre installation + +# master config setup +source ./config.sh +pushd $INSTALL_DIR/python-ogre/code_generators/$1 +python generate_code.py > build.out +popd Property changes on: trunk/python-ogre/scripts/gen_code.sh ___________________________________________________________________ Name: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-13 13:35:56
|
Revision: 417 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=417&view=rev Author: andy_miller Date: 2007-10-13 06:35:58 -0700 (Sat, 13 Oct 2007) Log Message: ----------- General bug fixes - more common functions moved into common_utils Updates for editable terrain, and ogre bullet Moved ogrebullet and forests into ThirdParty Updated QuickGUI Updated forests Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_nt.py trunk/python-ogre/ThirdParty/dxwebsetup.exe trunk/python-ogre/ThirdParty/opcode/Ice/IceTypes.h trunk/python-ogre/ThirdParty/opcode/OPC_IceHook.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIBorder.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIBorder.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIButton.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIButton.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIComboBox.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIComboBox.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalScrollBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalScrollBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalTrackBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalTrackBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIImage.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIImage.h trunk/python-ogre/ThirdParty/quickgui/QuickGUILabel.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUILabel.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIMouseCursor.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIMouseCursor.h trunk/python-ogre/ThirdParty/quickgui/QuickGUINStateButton.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUINStateButton.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIPanel.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIPanel.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIProgressBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIProgressBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuadContainer.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuadContainer.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIScrollPane.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIScrollPane.h trunk/python-ogre/ThirdParty/quickgui/QuickGUISheet.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUISheet.h trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIText.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUITextBox.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUITextBox.h trunk/python-ogre/ThirdParty/quickgui/QuickGUITitleBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUITitleBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIUtility.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIUtility.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalScrollBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalScrollBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalTrackBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalTrackBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIWindow.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIWindow.h trunk/python-ogre/code_generators/common_utils/__init__.py trunk/python-ogre/code_generators/common_utils/extract_documentation.py trunk/python-ogre/code_generators/common_utils/var_checker.py trunk/python-ogre/code_generators/et/customization_data.py trunk/python-ogre/code_generators/et/generate_code.py trunk/python-ogre/code_generators/et/python_et.h trunk/python-ogre/code_generators/ogre/generate_code.py trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py trunk/python-ogre/code_generators/ogrebulletc/generate_code.py trunk/python-ogre/code_generators/ogrebulletd/generate_code.py trunk/python-ogre/code_generators/ogreforests/generate_code.py trunk/python-ogre/code_generators/quickgui/generate_code.py trunk/python-ogre/code_generators/template/generate_code.py trunk/python-ogre/environment.py Added Paths: ----------- trunk/python-ogre/ThirdParty/CaelumPrerequisites.h trunk/python-ogre/ThirdParty/forests/ trunk/python-ogre/ThirdParty/forests/BatchPage.cpp trunk/python-ogre/ThirdParty/forests/BatchPage.h trunk/python-ogre/ThirdParty/forests/BatchedGeometry.cpp trunk/python-ogre/ThirdParty/forests/BatchedGeometry.h trunk/python-ogre/ThirdParty/forests/GrassLoader.cpp trunk/python-ogre/ThirdParty/forests/GrassLoader.h trunk/python-ogre/ThirdParty/forests/ImpostorPage.cpp trunk/python-ogre/ThirdParty/forests/ImpostorPage.h trunk/python-ogre/ThirdParty/forests/PagedGeometry.cpp trunk/python-ogre/ThirdParty/forests/PagedGeometry.h trunk/python-ogre/ThirdParty/forests/PropertyMaps.cpp trunk/python-ogre/ThirdParty/forests/PropertyMaps.h trunk/python-ogre/ThirdParty/forests/StaticBillboardSet.cpp trunk/python-ogre/ThirdParty/forests/StaticBillboardSet.h trunk/python-ogre/ThirdParty/forests/TreeLoader2D.cpp trunk/python-ogre/ThirdParty/forests/TreeLoader2D.h trunk/python-ogre/ThirdParty/forests/TreeLoader3D.cpp trunk/python-ogre/ThirdParty/forests/TreeLoader3D.h trunk/python-ogre/ThirdParty/forests/orig/ trunk/python-ogre/ThirdParty/forests/orig/PagedGeometry.h trunk/python-ogre/ThirdParty/ogrebullet/ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Debug/ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Debug/OgreBulletCollisionsDebugContact.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Debug/OgreBulletCollisionsDebugDrawer.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Debug/OgreBulletCollisionsDebugLines.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Debug/OgreBulletCollisionsDebugShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisions.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsBoxShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsCompoundShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsConeShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsConvexCast.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsConvexHullShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsCylinderShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsDebugContact.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsDebugDrawer.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsDebugLines.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsDebugShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsMeshToShapeConverter.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsMinkowskiSumShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsMultiSphereShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsObject.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsObject.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsObjectState.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsObjectState.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPreRequisites.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsPrecompiled.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsRay.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsRay.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsSphereShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsStaticPlaneShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsTriangleShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsTrimeshShape.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsWorld.cpp trunk/python-ogre/ThirdParty/ogrebullet/Collisions/OgreBulletCollisionsWorld.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsBoxShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsCompoundShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsConeShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsConvexHullShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsCylinderShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsMinkowskiSumShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsMultiSphereShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsSphereShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsStaticPlaneShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsTriangleShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Shapes/OgreBulletCollisionsTrimeshShape.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Utils/ trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Utils/OgreBulletCollisionsMeshToShapeConverter.h trunk/python-ogre/ThirdParty/ogrebullet/Collisions/Utils/OgreBulletConverter.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/ trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/Constraints/ trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/Constraints/OgreBulletDynamics6DofConstraint.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/Constraints/OgreBulletDynamicsConeTwistConstraint.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/Constraints/OgreBulletDynamicsHingeConstraint.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/Constraints/OgreBulletDynamicsPoint2pointConstraint.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/Constraints/OgreBulletDynamicsRaycastVehicle.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamics.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamics6DofConstraint.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsConeTwistConstraint.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsConstraint.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsConstraint.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsHingeConstraint.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsObjectState.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsObjectState.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsPoint2pointConstraint.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsPreRequisites.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsPrecompiled.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsRaycastVehicle.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsRigidBody.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsRigidBody.h trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsWorld.cpp trunk/python-ogre/ThirdParty/ogrebullet/Dynamics/OgreBulletDynamicsWorld.h trunk/python-ogre/ThirdParty/opcode/IceAABB.cpp trunk/python-ogre/ThirdParty/opcode/IceAABB.h trunk/python-ogre/ThirdParty/opcode/IceAxes.h trunk/python-ogre/ThirdParty/opcode/IceBoundingSphere.h trunk/python-ogre/ThirdParty/opcode/IceContainer.cpp trunk/python-ogre/ThirdParty/opcode/IceContainer.h trunk/python-ogre/ThirdParty/opcode/IceFPU.h trunk/python-ogre/ThirdParty/opcode/IceHPoint.cpp trunk/python-ogre/ThirdParty/opcode/IceHPoint.h trunk/python-ogre/ThirdParty/opcode/IceIndexedTriangle.cpp trunk/python-ogre/ThirdParty/opcode/IceIndexedTriangle.h trunk/python-ogre/ThirdParty/opcode/IceLSS.h trunk/python-ogre/ThirdParty/opcode/IceMatrix3x3.cpp trunk/python-ogre/ThirdParty/opcode/IceMatrix3x3.h trunk/python-ogre/ThirdParty/opcode/IceMatrix4x4.cpp trunk/python-ogre/ThirdParty/opcode/IceMatrix4x4.h trunk/python-ogre/ThirdParty/opcode/IceMemoryMacros.h trunk/python-ogre/ThirdParty/opcode/IceOBB.cpp trunk/python-ogre/ThirdParty/opcode/IceOBB.h trunk/python-ogre/ThirdParty/opcode/IcePairs.h trunk/python-ogre/ThirdParty/opcode/IcePlane.cpp trunk/python-ogre/ThirdParty/opcode/IcePlane.h trunk/python-ogre/ThirdParty/opcode/IcePoint.cpp trunk/python-ogre/ThirdParty/opcode/IcePoint.h trunk/python-ogre/ThirdParty/opcode/IcePreprocessor.h trunk/python-ogre/ThirdParty/opcode/IceRandom.cpp trunk/python-ogre/ThirdParty/opcode/IceRandom.h trunk/python-ogre/ThirdParty/opcode/IceRay.cpp trunk/python-ogre/ThirdParty/opcode/IceRay.h trunk/python-ogre/ThirdParty/opcode/IceRevisitedRadix.cpp trunk/python-ogre/ThirdParty/opcode/IceRevisitedRadix.h trunk/python-ogre/ThirdParty/opcode/IceSegment.cpp trunk/python-ogre/ThirdParty/opcode/IceSegment.h trunk/python-ogre/ThirdParty/opcode/IceTriangle.cpp trunk/python-ogre/ThirdParty/opcode/IceTriangle.h trunk/python-ogre/ThirdParty/opcode/IceTrilist.h trunk/python-ogre/ThirdParty/opcode/IceTypes.h trunk/python-ogre/ThirdParty/opcode/IceUtils.cpp trunk/python-ogre/ThirdParty/opcode/IceUtils.h trunk/python-ogre/ThirdParty/opcode/Opcode.dsp trunk/python-ogre/ThirdParty/opcode/Opcode.dsw trunk/python-ogre/ThirdParty/opcode/Opcode.ncb trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenuLabel.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenuLabel.h trunk/python-ogre/demos/ogrebullet/ trunk/python-ogre/demos/ogrebullet/Demo_OgreCollision01.py trunk/python-ogre/demos/ogrebullet/SampleFramework.py trunk/python-ogre/demos/ogrebullet/plugins.cfg trunk/python-ogre/demos/ogrebullet/resources.cfg Removed Paths: ------------- trunk/python-ogre/ThirdParty/quickgui/QuickGUIListItem.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIListItem.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenu.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenu.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenuList.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenuList.h Modified: trunk/python-ogre/PythonOgreConfig_nt.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-11 13:50:16 UTC (rev 416) +++ trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-13 13:35:58 UTC (rev 417) @@ -32,9 +32,11 @@ PATH_OPENAL= os.path.join(BASE_DIR, 'openal') PATH_ALUT= os.path.join(BASE_DIR, 'freealut') PATH_OgreOde= os.path.join(BASE_DIR, PATH_OgreAddons,'ogreode') -PATH_OgreBullet= os.path.join(PATH_OgreAddons,'ogrebullet') -PATH_ogreforests= os.path.join(PATH_OgreAddons,'forests') +# # PATH_OgreBullet= os.path.join(PATH_OgreAddons,'ogrebullet') +# # PATH_ogreforests= os.path.join(PATH_OgreAddons,'forests') +PATH_OgreBullet= os.path.join(PATH_THIRDPARTY,'ogrebullet') +PATH_ogreforests= os.path.join(PATH_THIRDPARTY,'forests') PATH_OGREAL= os.path.join(PATH_THIRDPARTY,'ogreal') PATH_OPCODE= os.path.join(PATH_THIRDPARTY,'opcode') PATH_quickgui= os.path.join(PATH_THIRDPARTY,'quickgui') @@ -74,7 +76,7 @@ PATH_LIB_ODE = os.path.join( PATH_ODE, 'lib/releaselib')## probable releaselib for posix PATH_LIB_OPCODE = os.path.join( PATH_OPCODE ) PATH_LIB_OgreOde = os.path.join( PATH_OgreOde, 'lib/Release') -PATH_LIB_OgreBullet = os.path.join( PATH_OgreBullet, 'lib/Release') +# # PATH_LIB_OgreBullet = os.path.join( PATH_OgreBullet, 'lib/Release') PATH_LIB_OgreOdePrefab = os.path.join( PATH_OgreOde, 'prefab/lib/Release' ) PATH_LIB_OgreOdeLoader = os.path.join( PATH_OgreOde, 'loader/lib/Release' ) PATH_LIB_OgreAL = os.path.join( PATH_OGREAL)#, 'lib/Release' ) @@ -111,10 +113,13 @@ PATH_INCLUDE_OGG= os.path.join( PATH_OGG, 'include' ) PATH_INCLUDE_VORBIS= os.path.join( PATH_VORBIS, 'include' ) PATH_INCLUDE_ALUT= os.path.join( PATH_ALUT, 'include' ) -PATH_INCLUDE_OgreBullet = [ - os.path.join( PATH_OgreBullet,'Collisions','include') - ,os.path.join( PATH_OgreBullet,'Dynamics','include') - ] + +# # PATH_INCLUDE_OgreBullet = [ +# # os.path.join( PATH_OgreBullet,'Collisions','include') +# # ,os.path.join( PATH_OgreBullet,'Dynamics','include') +# # ] +##PATH_INCLUDE_OgreBullet = PATH_OgreBullet + PATH_INCLUDE_OgreOde = os.path.join( PATH_OgreOde,'include') PATH_INCLUDE_OgreOdePrefab= os.path.join( PATH_OgreOde,'prefab/include') PATH_INCLUDE_OgreOdeLoader= os.path.join( PATH_OgreOde,'loader/include') @@ -131,7 +136,8 @@ PATH_INCLUDE_ogredshow = PATH_ogredshow PATH_INCLUDE_plib = PATH_plib PATH_INCLUDE_navi = os.path.join (PATH_navi,'include') -PATH_INCLUDE_ogreforests = os.path.join (PATH_ogreforests,'include') +##PATH_INCLUDE_ogreforests = os.path.join (PATH_ogreforests,'include') +PATH_INCLUDE_ogreforests = PATH_ogreforests PATH_INCLUDE_OggVorbisTheora = [ os.path.join(BASE_DIR,'ogg','include') ,os.path.join(BASE_DIR, 'vorbis', 'include') Added: trunk/python-ogre/ThirdParty/CaelumPrerequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/CaelumPrerequisites.h (rev 0) +++ trunk/python-ogre/ThirdParty/CaelumPrerequisites.h 2007-10-13 13:35:58 UTC (rev 417) @@ -0,0 +1,39 @@ +#ifndef CAELUMPREREQUISITES_H +#define CAELUMPREREQUISITES_H + +// Include external headers +#include "Ogre.h" + +#define DllExport + +// Define the version code +#define CAELUM_VERSION_MAIN 0 +#define CAELUM_VERSION_SEC 2 +#define CAELUM_VERSION_TER 1 +#define CAELUM_VERSION = (CAELUM_VERSION_MAIN << 16) | (CAELUM_VERSION_SEC << 8) | CAELUM_VERSION_TER + +namespace caelum { + /// Resource group name for caelum resources. + extern DllExport Ogre::String RESOURCE_GROUP_NAME; + + /* Set a global camera distances modifier for the clipping distance. + This threshold will be substracted from the far clipping distance if applicable, else it will be + added to the near clipping distance (ie, if infinite far clipping distance is used). + */ + const float CAMERA_DISTANCE_MODIFIER = 0; + + // Render grounp for caelum stuff + // It's best to have them all together + enum CaelumRenderQueueGroupId + { + CAELUM_RENDER_QUEUE_STARFIELD = Ogre::RENDER_QUEUE_SKIES_EARLY + 0, + CAELUM_RENDER_QUEUE_SKYDOME = Ogre::RENDER_QUEUE_SKIES_EARLY + 1, + CAELUM_RENDER_QUEUE_SUN = Ogre::RENDER_QUEUE_SKIES_EARLY + 2, + CAELUM_RENDER_QUEUE_CLOUDS = Ogre::RENDER_QUEUE_SKIES_EARLY + 3, + }; +} + +// Log macro +#define LOG(msg) Ogre::LogManager::getSingleton().logMessage(msg); + +#endif //CAELUMPREREQUISITES_H Modified: trunk/python-ogre/ThirdParty/dxwebsetup.exe =================================================================== (Binary files differ) Added: trunk/python-ogre/ThirdParty/forests/BatchPage.cpp =================================================================== --- trunk/python-ogre/ThirdParty/forests/BatchPage.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/forests/BatchPage.cpp 2007-10-13 13:35:58 UTC (rev 417) @@ -0,0 +1,265 @@ +/*------------------------------------------------------------------------------------- +Copyright (c) 2006 John Judnich + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------------*/ + +//BatchPage.cpp +//BatchPage is an extension to PagedGeometry which displays entities as static geometry. +//------------------------------------------------------------------------------------- + +#include "BatchPage.h" +#include "BatchedGeometry.h" + +#include "OgreRoot.h" +#include "OgreCamera.h" +#include "OgreVector3.h" +#include "OgreQuaternion.h" +#include "OgreEntity.h" +#include "OgreRenderSystem.h" +#include "OgreRenderSystemCapabilities.h" +#include "OgreHighLevelGpuProgram.h" +#include "OgreHighLevelGpuProgramManager.h" +using namespace Ogre; + + +//------------------------------------------------------------------------------------- + + +unsigned long BatchPage::refCount = 0; +unsigned long BatchPage::GUID = 0; + +void BatchPage::init(PagedGeometry *geom) +{ + sceneMgr = geom->getSceneManager(); + batch = new BatchedGeometry(sceneMgr); + + fadeEnabled = false; + + const RenderSystemCapabilities *caps = Root::getSingleton().getRenderSystem()->getCapabilities(); + if (caps->hasCapability(RSC_VERTEX_PROGRAM)) + shadersSupported = true; + else + shadersSupported = false; + + ++refCount; +} + +BatchPage::~BatchPage() +{ + delete batch; + + //Delete unfaded material references + unfadedMaterials.clear(); +} + + +void BatchPage::addEntity(Entity *ent, const Vector3 &position, const Quaternion &rotation, const Vector3 &scale, const Ogre::ColourValue &color) +{ + batch->addEntity(ent, position, rotation, scale, color); +} + +void BatchPage::build() +{ + batch->build(); + + BatchedGeometry::SubBatchIterator it = batch->getSubBatchIterator(); + while (it.hasMoreElements()){ + BatchedGeometry::SubBatch *subBatch = it.getNext(); + MaterialPtr mat = subBatch->getMaterial(); + + //Disable specular unless a custom shader is being used. + //This is done because the default shader applied by BatchPage + //doesn't support specular, and fixed-function needs to look + //the same as the shader (for computers with no shader support) + for (int t = 0; t < mat->getNumTechniques(); ++t){ + Technique *tech = mat->getTechnique(t); + for (int p = 0; p < tech->getNumPasses(); ++p){ + Pass *pass = tech->getPass(p); + if (pass->getVertexProgramName() == "") + pass->setSpecular(0, 0, 0, 1); + } + } + + //Store the original materials + unfadedMaterials.push_back(subBatch->getMaterial()); + } + + _updateShaders(); +} + +void BatchPage::removeEntities() +{ + batch->clear(); + + unfadedMaterials.clear(); + fadeEnabled = false; +} + + +void BatchPage::setVisible(bool visible) +{ + batch->setVisible(visible); +} + +void BatchPage::setFade(bool enabled, Real visibleDist, Real invisibleDist) +{ + if (!shadersSupported) + return; + + //If fade status has changed... + if (fadeEnabled != enabled){ + fadeEnabled = enabled; + + if (enabled) { + //Transparent batches should render after impostors + batch->setRenderQueueGroup(RENDER_QUEUE_6); + } else { + //Opaque batches should render in the normal render queue + batch->setRenderQueueGroup(RENDER_QUEUE_MAIN); + } + + this->visibleDist = visibleDist; + this->invisibleDist = invisibleDist; + _updateShaders(); + } +} + +void BatchPage::_updateShaders() +{ + if (!shadersSupported) + return; + + unsigned int i = 0; + BatchedGeometry::SubBatchIterator it = batch->getSubBatchIterator(); + while (it.hasMoreElements()){ + BatchedGeometry::SubBatch *subBatch = it.getNext(); + MaterialPtr mat = unfadedMaterials[i++]; + + //Compile the CG shader script based on various material / fade options + StringUtil::StrStreamType tmpName; + tmpName << "BatchPage_"; + if (fadeEnabled) + tmpName << "fade_"; + tmpName << "vp"; + + const String vertexProgName = tmpName.str(); + + //If the shader hasn't been created yet, create it + if (HighLevelGpuProgramManager::getSingleton().getByName(vertexProgName).isNull()){ + String vertexProgSource = + "void main( \n" + " float3 normal : NORMAL, \n" + " float4 iPosition : POSITION, \n" + " float4 iColor : COLOR, \n" + " float2 iUV : TEXCOORD0, \n" + + " out float4 oPosition : POSITION, \n" + " out float4 oColor : COLOR, \n" + " out float2 oUV : TEXCOORD0, \n" + " out float4 oFog : FOG, \n" + + " uniform float4 objSpaceLight, \n" + " uniform float4 lightDiffuse, \n" + " uniform float4 lightAmbient, \n" + " uniform float4 matAmbient, \n"; + + if (fadeEnabled) vertexProgSource += + " uniform float3 camPos, \n"; + + vertexProgSource += + " uniform float4x4 worldViewProj, \n" + " uniform float fadeGap, \n" + " uniform float invisibleDist )\n" + "{ \n"; + + vertexProgSource += + //Perform lighting calculations (no specular) + " float3 light = normalize(objSpaceLight.xyz - (iPosition.xyz * objSpaceLight.w)); \n" + " float diffuseFactor = max(dot(normal, light), 0); \n" + " oColor = lightAmbient + diffuseFactor * lightDiffuse; \n"; + + vertexProgSource += + " oColor *= (iColor / matAmbient); \n"; + + if (fadeEnabled) vertexProgSource += + //Fade out in the distance + " float dist = distance(camPos.xz, iPosition.xz); \n" + " oColor.a *= (invisibleDist - dist) / fadeGap; \n"; + + vertexProgSource += + " oUV = iUV; \n" + " oPosition = mul(worldViewProj, iPosition); \n" + " oFog.x = oPosition.z; \n" + "}"; + + HighLevelGpuProgramPtr vertexShader = HighLevelGpuProgramManager::getSingleton().createProgram( + vertexProgName, + ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_VERTEX_PROGRAM); + + vertexShader->setSource(vertexProgSource); + vertexShader->setParameter("profiles", "vs_1_1 arbvp1"); + vertexShader->setParameter("entry_point", "main"); + vertexShader->load(); + } + + //Now that the shader is ready to be applied, apply it + StringUtil::StrStreamType materialSignature; + materialSignature << "BatchMat|"; + materialSignature << mat->getName() << "|"; + if (fadeEnabled){ + materialSignature << visibleDist << "|"; + materialSignature << invisibleDist << "|"; + } + + //Search for the desired material + MaterialPtr generatedMaterial = MaterialManager::getSingleton().getByName(materialSignature.str()); + if (generatedMaterial.isNull()){ + //Clone the material + generatedMaterial = mat->clone(materialSignature.str()); + + //And apply the fade shader + for (unsigned short t = 0; t < generatedMaterial->getNumTechniques(); ++t){ + Technique *tech = generatedMaterial->getTechnique(t); + for (unsigned short p = 0; p < tech->getNumPasses(); ++p){ + Pass *pass = tech->getPass(p); + + //Setup vertex program + pass->setVertexProgram(vertexProgName); + GpuProgramParametersSharedPtr params = pass->getVertexProgramParameters(); + + params->setNamedAutoConstant("objSpaceLight", GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE); + params->setNamedAutoConstant("lightDiffuse", GpuProgramParameters::ACT_DERIVED_LIGHT_DIFFUSE_COLOUR); + params->setNamedAutoConstant("lightAmbient", GpuProgramParameters::ACT_DERIVED_AMBIENT_LIGHT_COLOUR); + + params->setNamedAutoConstant("matAmbient", GpuProgramParameters::ACT_SURFACE_AMBIENT_COLOUR); + params->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); + + if (fadeEnabled){ + params->setNamedAutoConstant("camPos", GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE); + + //Set fade ranges + params->setNamedAutoConstant("invisibleDist", GpuProgramParameters::ACT_CUSTOM); + params->setNamedConstant("invisibleDist", invisibleDist); + + params->setNamedAutoConstant("fadeGap", GpuProgramParameters::ACT_CUSTOM); + params->setNamedConstant("fadeGap", invisibleDist - visibleDist); + + if (pass->getAlphaRejectFunction() == CMPF_ALWAYS_PASS) + pass->setSceneBlending(SBT_TRANSPARENT_ALPHA); + } + } + } + + } + + //Apply the material + subBatch->setMaterial(generatedMaterial); + } + +} Added: trunk/python-ogre/ThirdParty/forests/BatchPage.h =================================================================== --- trunk/python-ogre/ThirdParty/forests/BatchPage.h (rev 0) +++ trunk/python-ogre/ThirdParty/forests/BatchPage.h 2007-10-13 13:35:58 UTC (rev 417) @@ -0,0 +1,78 @@ +/*------------------------------------------------------------------------------------- +Copyright (c) 2006 John Judnich + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------------*/ + +//BatchPage.h +//BatchPage is an extension to PagedGeometry which displays entities as static geometry. +//------------------------------------------------------------------------------------- + +#ifndef __BatchPage_H__ +#define __BatchPage_H__ + +#include "PagedGeometry.h" +#include "BatchedGeometry.h" + +#include "OgrePrerequisites.h" +#include "OgreStringConverter.h" + + +/** +\brief The BatchPage class renders entities as StaticGeometry. + +This is one of the geometry page types included in the StaticGeometry engine. These +page types should be added to a PagedGeometry object with PagedGeometry::addDetailLevel() +so the PagedGeometry will know how you want your geometry displayed. + +To use this page type, use: +\code +PagedGeometry::addDetailLevel<BatchPage>(farRange); +\endcode + +This page type uses batched geometry (Ogre::StaticGeometry) to represent the entities. +Batched geometry is generally much faster than plain entities, since video card state +changes and transform calculations can be minimized. Batched geometry can be anywhere +from 2 to 20 times faster than plain entities. +*/ +class BatchPage: public GeometryPage +{ +public: + void init(PagedGeometry *geom); + ~BatchPage(); + + void addEntity(Ogre::Entity *ent, const Ogre::Vector3 &position, const Ogre::Quaternion &rotation, const Ogre::Vector3 &scale, const Ogre::ColourValue &color); + void build(); + void removeEntities(); + + void setVisible(bool visible); + void setFade(bool enabled, Ogre::Real visibleDist, Ogre::Real invisibleDist); + + void addEntityToBoundingBox() {} + void clearBoundingBox() {} + const Ogre::AxisAlignedBox &getBoundingBox() { return batch->getBoundingBox(); } + +private: + void _updateShaders(); + + bool fadeEnabled, shadersSupported; + Ogre::Real visibleDist, invisibleDist; + std::vector<Ogre::MaterialPtr> unfadedMaterials; + + Ogre::SceneManager *sceneMgr; + BatchedGeometry *batch; + + static unsigned long refCount; + static unsigned long GUID; + static inline Ogre::String getUniqueID(const Ogre::String &prefix) + { + return prefix + Ogre::StringConverter::toString(++GUID); + } +}; + + +#endif Added: trunk/python-ogre/ThirdParty/forests/BatchedGeometry.cpp =================================================================== --- trunk/python-ogre/ThirdParty/forests/BatchedGeometry.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/forests/BatchedGeometry.cpp 2007-10-13 13:35:58 UTC (rev 417) @@ -0,0 +1,607 @@ +/*------------------------------------------------------------------------------------- +Copyright (c) 2006 John Judnich + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------------*/ + +//BatchedGeometry.h +//A "lightweight" version of Ogre::StaticGeometry, which gives you a little more control +//over the batch materials, etc. +//------------------------------------------------------------------------------------- + +#include "BatchedGeometry.h" + +#include "OgreRoot.h" +#include "OgreRenderSystem.h" +#include "OgreCamera.h" +#include "OgreVector3.h" +#include "OgreQuaternion.h" +#include "OgreSceneNode.h" +#include "OgreString.h" +#include "OgreStringConverter.h" +#include "OgreEntity.h" +#include "OgreSubMesh.h" +#include "OgreMesh.h" +#include "OgreMeshManager.h" +#include "OgreHardwareBufferManager.h" +#include "OgreHardwareBuffer.h" +#include "OgreMaterialManager.h" +#include "OgreMaterial.h" +using namespace Ogre; + + +//------------------------------------------------------------------------------------- + +BatchedGeometry::BatchedGeometry(SceneManager *mgr) + : withinFarDistance(0), + minDistanceSquared(0), + sceneNode(NULL), + sceneMgr(mgr), + built(false), + boundsUndefined(true) + +{ + clear(); +} + +BatchedGeometry::~BatchedGeometry() +{ + clear(); +} + +void BatchedGeometry::addEntity(Entity *ent, const Vector3 &position, const Quaternion &orientation, const Vector3 &scale, const Ogre::ColourValue &color) +{ + //For each submesh + Mesh::SubMeshIterator i = ent->getMesh()->getSubMeshIterator(); + while (i.hasMoreElements()){ + //Get the submesh + SubMesh *mesh = i.peekNext(); + + //Generate a format string that uniquely identifies this material & vertex/index format + String formatStr = getFormatString(mesh); + + //If a batch using an identical format exists... + SubBatch *batch; + SubBatchMap::iterator batchIter = subBatchMap.find(formatStr); + if (batchIter != subBatchMap.end()){ + //Use the batch + batch = batchIter->second; + } else { + //Otherwise create a new batch + batch = new SubBatch(this, mesh); + subBatchMap.insert(std::pair<String, SubBatch*>(formatStr, batch)); + } + + //Now add the submesh to the compatible batch + batch->addSubMesh(mesh, position, orientation, scale, color); + + //Next item + i.getNext(); + } + + //Update bounding box + Matrix4 mat(orientation); + mat.setScale(scale); + AxisAlignedBox entBounds = ent->getBoundingBox(); + entBounds.transform(mat); + + if (boundsUndefined){ + bounds.setMinimum(entBounds.getMinimum() + position); + bounds.setMaximum(entBounds.getMaximum() + position); + boundsUndefined = false; + } else { + Vector3 min = bounds.getMinimum(); + Vector3 max = bounds.getMaximum(); + min.makeFloor(entBounds.getMinimum() + position); + max.makeCeil(entBounds.getMaximum() + position); + bounds.setMinimum(min); + bounds.setMaximum(max); + } +} + +BatchedGeometry::SubBatchIterator BatchedGeometry::getSubBatchIterator() const +{ + return BatchedGeometry::SubBatchIterator((SubBatchMap&)subBatchMap); +} + +String BatchedGeometry::getFormatString(SubMesh *mesh) +{ + StringUtil::StrStreamType str; + + str << mesh->getMaterialName() << "|"; + str << mesh->indexData->indexBuffer->getType() << "|"; + + const VertexDeclaration::VertexElementList &elemList = mesh->vertexData->vertexDeclaration->getElements(); + VertexDeclaration::VertexElementList::const_iterator i; + for (i = elemList.begin(); i != elemList.end(); ++i) + { + const VertexElement &element = *i; + str << element.getSource() << "|"; + str << element.getSemantic() << "|"; + str << element.getType() << "|"; + } + + return str.str(); +} + +void BatchedGeometry::build() +{ + ///Make sure the batch hasn't already been built + if (built) + OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Invalid call to build() - geometry is already batched (call clear() first)", "BatchedGeometry::GeomBatch::build()"); + + if (subBatchMap.size() != 0) { + //Finish bounds information + center = bounds.getCenter(); //Calculate bounds center + bounds.setMinimum(bounds.getMinimum() - center); //Center the bounding box + bounds.setMaximum(bounds.getMaximum() - center); //Center the bounding box + radius = bounds.getMaximum().length(); //Calculate BB radius + + //Create scene node + sceneNode = sceneMgr->getRootSceneNode()->createChildSceneNode(center); + + //Build each batch + for (SubBatchMap::iterator i = subBatchMap.begin(); i != subBatchMap.end(); ++i){ + i->second->build(); + } + + //Attach the batch to the scene node + sceneNode->attachObject(this); + + //Debug + //sceneNode->showBoundingBox(true); + + built = true; + } + +} + +void BatchedGeometry::clear() +{ + //Remove the batch from the scene + if (sceneNode){ + sceneNode->removeAllChildren(); + sceneMgr->destroySceneNode(sceneNode->getName()); + sceneNode = NULL; + } + + //Reset bounds information + boundsUndefined = true; + center = Vector3::ZERO; + radius = 0; + + //Delete each batch + for (SubBatchMap::iterator i = subBatchMap.begin(); i != subBatchMap.end(); ++i){ + delete i->second; + } + subBatchMap.clear(); + + built = false; +} + +void BatchedGeometry::_updateRenderQueue(RenderQueue *queue) +{ + //If visible... + if (isVisible()){ + //Ask each batch to add itself to the render queue if appropriate + for (SubBatchMap::iterator i = subBatchMap.begin(); i != subBatchMap.end(); ++i){ + i->second->addSelfToRenderQueue(queue, getRenderQueueGroup()); + } + } +} + +bool BatchedGeometry::isVisible() +{ + return mVisible && withinFarDistance; +} + +void BatchedGeometry::_notifyCurrentCamera(Camera *cam) +{ + if (getRenderingDistance() == 0) { + withinFarDistance = true; + } else { + //Calculate camera distance + Vector3 camVec = cam->getDerivedPosition() - center; + Real centerDistanceSquared = camVec.squaredLength(); + minDistanceSquared = std::max(0.0f, centerDistanceSquared - (radius * radius)); + //Note: centerDistanceSquared measures the distance between the camera and the center of the GeomBatch, + //while minDistanceSquared measures the closest distance between the camera and the closest edge of the + //geometry's bounding sphere. + + //Determine whether the BatchedGeometry is within the far rendering distance + withinFarDistance = minDistanceSquared <= Math::Sqr(getRenderingDistance()); + } +} + + + + +BatchedGeometry::SubBatch::SubBatch(BatchedGeometry *parent, SubMesh *mesh) +{ + meshType = mesh; + material = MaterialManager::getSingleton().getByName(mesh->getMaterialName()); + this->parent = parent; + built = false; + + //Setup vertex/index data structure + vertexData = mesh->vertexData->clone(false); + indexData = mesh->indexData->clone(false); + + //Remove blend weights from vertex format + const VertexElement* blendIndices = vertexData->vertexDeclaration->findElementBySemantic(VES_BLEND_INDICES); + const VertexElement* blendWeights = vertexData->vertexDeclaration->findElementBySemantic(VES_BLEND_WEIGHTS); + if (blendIndices && blendWeights) + { + //Check for format errors + assert(blendIndices->getSource() == blendWeights->getSource() + && "Blend indices and weights should be in the same buffer"); + assert(blendIndices->getSize() + blendWeights->getSize() == vertexData->vertexBufferBinding->getBuffer(blendIndices->getSource())->getVertexSize() + && "Blend indices and blend buffers should have buffer to themselves!"); + + //Remove the blend weights + vertexData->vertexBufferBinding->unsetBinding(blendIndices->getSource()); + vertexData->vertexDeclaration->removeElement(VES_BLEND_INDICES); + vertexData->vertexDeclaration->removeElement(VES_BLEND_WEIGHTS); + #if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR > 2 + vertexData->closeGapsInBindings(); + #endif + } + + //Reset vertex/index count + vertexData->vertexStart = 0; + vertexData->vertexCount = 0; + indexData->indexStart = 0; + indexData->indexCount = 0; +} + +BatchedGeometry::SubBatch::~SubBatch() +{ + clear(); + + delete vertexData; + delete indexData; +} + +void BatchedGeometry::SubBatch::addSubMesh(SubMesh *mesh, const Vector3 &position, const Quaternion &orientation, const Vector3 &scale, const Ogre::ColourValue &color) +{ + assert(!built); + + //Add this submesh to the queue + QueuedMesh newMesh; + newMesh.mesh = mesh; + newMesh.position = position; + newMesh.orientation = orientation; + newMesh.scale = scale; + + newMesh.color = color; + VertexElementType format = Root::getSingleton().getRenderSystem()->getColourVertexElementType(); + switch (format){ + case VET_COLOUR_ARGB: + std::swap(newMesh.color.r, newMesh.color.b); + break; + case VET_COLOUR_ABGR: + break; + default: + OGRE_EXCEPT(0, "Unknown RenderSystem color format", "BatchedGeometry::SubBatch::addSubMesh()"); + break; + } + + meshQueue.push_back(newMesh); + + //Increment the vertex/index count so the buffers will have room for this mesh + vertexData->vertexCount += mesh->vertexData->vertexCount; + indexData->indexCount += mesh->indexData->indexCount; +} + +void BatchedGeometry::SubBatch::build() +{ + assert(!built); + + //Misc. setup + Vector3 batchCenter = parent->center; + + //Allocate the index buffer + HardwareIndexBuffer::IndexType indexType = meshType->indexData->indexBuffer->getType(); + indexData->indexBuffer = HardwareBufferManager::getSingleton() + .createIndexBuffer(indexType, indexData->indexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY); + + //Lock the index buffer + uint32 *indexBuffer32; + uint16 *indexBuffer16; + if (indexType == HardwareIndexBuffer::IT_32BIT) + indexBuffer32 = static_cast<uint32*>(indexData->indexBuffer->lock(HardwareBuffer::HBL_DISCARD)); + else + indexBuffer16 = static_cast<uint16*>(indexData->indexBuffer->lock(HardwareBuffer::HBL_DISCARD)); + + //Allocate & lock the vertex buffers + std::vector<uchar*> vertexBuffers; + std::vector<VertexDeclaration::VertexElementList> vertexBufferElements; + + VertexBufferBinding *vertBinding = vertexData->vertexBufferBinding; + VertexDeclaration *vertDecl = vertexData->vertexDeclaration; + + for (Ogre::ushort i = 0; i < vertBinding->getBufferCount(); ++i) + { + HardwareVertexBufferSharedPtr buffer = HardwareBufferManager::getSingleton() + .createVertexBuffer(vertDecl->getVertexSize(i), vertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY); + vertBinding->setBinding(i, buffer); + + vertexBuffers.push_back(static_cast<uchar*>(buffer->lock(HardwareBuffer::HBL_DISCARD))); + vertexBufferElements.push_back(vertDecl->findElementsBySource(i)); + } + + //If no vertex colors are used, make sure the final batch includes them (so the shade values work) + if (!vertexData->vertexDeclaration->findElementBySemantic(VES_DIFFUSE)) { + Ogre::ushort i = (ushort)vertBinding->getBufferCount(); + + vertDecl->addElement(i, 0, VET_COLOUR, VES_DIFFUSE); + + HardwareVertexBufferSharedPtr buffer = HardwareBufferManager::getSingleton() + .createVertexBuffer(vertDecl->getVertexSize(i), vertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY); + vertBinding->setBinding(i, buffer); + + vertexBuffers.push_back(static_cast<uchar*>(buffer->lock(HardwareBuffer::HBL_DISCARD))); + vertexBufferElements.push_back(vertDecl->findElementsBySource(i)); + + } + + //Prepare vertex colors + Pass *p = material->getTechnique(0)->getPass(0); + p->setVertexColourTracking(TVC_AMBIENT); + + ColourValue ambient = p->getAmbient(); + VertexElementType format = Root::getSingleton().getRenderSystem()->getColourVertexElementType(); + switch (format){ + case VET_COLOUR_ARGB: + std::swap(ambient.r, ambient.b); + break; + case VET_COLOUR_ABGR: + break; + default: + OGRE_EXCEPT(0, "Unknown RenderSystem color format", "BatchedGeometry::SubBatch::build()"); + break; + } + + + //For each queued mesh... + MeshQueueIterator it; + size_t indexOffset = 0; + for (it = meshQueue.begin(); it != meshQueue.end(); ++it) { + const QueuedMesh queuedMesh = (*it); + const IndexData *sourceIndexData = queuedMesh.mesh->indexData; + const VertexData *sourceVertexData = queuedMesh.mesh->vertexData; + + //Copy mesh vertex data into the vertex buffer + VertexBufferBinding *sourceBinds = sourceVertexData->vertexBufferBinding; + VertexBufferBinding *destBinds = vertexData->vertexBufferBinding; + for (Ogre::ushort i = 0; i < destBinds->getBufferCount(); ++i) + { + if (i < sourceBinds->getBufferCount()){ + //Lock the input buffer + HardwareVertexBufferSharedPtr sourceBuffer = sourceBinds->getBuffer(i); + uchar *sourceBase = static_cast<uchar*>(sourceBuffer->lock(HardwareBuffer::HBL_READ_ONLY)); + + //Get the locked output buffer + uchar *destBase = vertexBuffers[i]; + + //Copy vertices + float *sourcePtr, *destPtr; + for (size_t v = 0; v < sourceVertexData->vertexCount; ++v) + { + // Iterate over vertex elements + VertexDeclaration::VertexElementList &elems = vertexBufferElements[i]; + VertexDeclaration::VertexElementList::iterator ei; + for (ei = elems.begin(); ei != elems.end(); ++ei) + { + VertexElement &elem = *ei; + elem.baseVertexPointerToElement(sourceBase, &sourcePtr); + elem.baseVertexPointerToElement(destBase, &destPtr); + + Vector3 tmp; + uint32 tmpColor; + uint8 tmpR, tmpG, tmpB, tmpA; + + switch (elem.getSemantic()) + { + case VES_POSITION: + tmp.x = *sourcePtr++; + tmp.y = *sourcePtr++; + tmp.z = *sourcePtr++; + + //Transform + tmp = (queuedMesh.orientation * (tmp * queuedMesh.scale)) + queuedMesh.position; + tmp -= batchCenter; //Adjust for batch center + + *destPtr++ = tmp.x; + *destPtr++ = tmp.y; + *destPtr++ = tmp.z; + break; + + case VES_NORMAL: + tmp.x = *sourcePtr++; + tmp.y = *sourcePtr++; + tmp.z = *sourcePtr++; + + //Rotate + tmp = queuedMesh.orientation * tmp; + + *destPtr++ = tmp.x; + *destPtr++ = tmp.y; + *destPtr++ = tmp.z; + break; + + case VES_DIFFUSE: + tmpColor = *((uint32*)sourcePtr++); + tmpR = ((tmpColor) & 0xFF) * queuedMesh.color.r * ambient.r; + tmpG = ((tmpColor >> 8) & 0xFF) * queuedMesh.color.g * ambient.g; + tmpB = ((tmpColor >> 16) & 0xFF) * queuedMesh.color.b * ambient.b; + tmpA = (tmpColor >> 24) & 0xFF; + + tmpColor = tmpR | (tmpG << 8) | (tmpB << 16) | (tmpA << 24); + *((uint32*)destPtr++) = tmpColor; + break; + + case VES_TANGENT: + case VES_BINORMAL: + tmp.x = *sourcePtr++; + tmp.y = *sourcePtr++; + tmp.z = *sourcePtr++; + + //Rotate + tmp = queuedMesh.orientation * tmp; + + *destPtr++ = tmp.x; + *destPtr++ = tmp.y; + *destPtr++ = tmp.z; + break; + + default: + //Raw copy + memcpy(destPtr, sourcePtr, VertexElement::getTypeSize(elem.getType())); + break; + }; + } + + // Increment both pointers + destBase += sourceBuffer->getVertexSize(); + sourceBase += sourceBuffer->getVertexSize(); + } + + //Unlock the input buffer + vertexBuffers[i] = destBase; + sourceBuffer->unlock(); + } else { + //Get the locked output buffer + uint32 *startPtr = (uint32*)vertexBuffers[vertBinding->getBufferCount()-1]; + uint32 *endPtr = startPtr + sourceVertexData->vertexCount; + + //Generate color + uint8 tmpR = ambient.r * queuedMesh.color.r * 255; + uint8 tmpG = ambient.g * queuedMesh.color.g * 255; + uint8 tmpB = ambient.b * queuedMesh.color.b * 255; + uint32 tmpColor = tmpR | (tmpG << 8) | (tmpB << 16) | (0xFF << 24); + + //Copy colors + while (startPtr < endPtr) { + *startPtr++ = tmpColor; + } + + vertexBuffers[vertBinding->getBufferCount()-1] += (sizeof(uint32) * sourceVertexData->vertexCount); + } + } + + + //Copy mesh index data into the index buffer + if (indexType == HardwareIndexBuffer::IT_32BIT) { + //Lock the input buffer + uint32 *source = static_cast<uint32*>(sourceIndexData->indexBuffer->lock( + sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY + )); + uint32 *sourceEnd = source + sourceIndexData->indexCount; + + //And copy it to the output buffer + while (source != sourceEnd) { + *indexBuffer32++ = static_cast<uint32>(*source++ + indexOffset); + } + + //Unlock the input buffer + sourceIndexData->indexBuffer->unlock(); + + //Increment the index offset + indexOffset += sourceVertexData->vertexCount; + } else { + //Lock the input buffer + uint16 *source = static_cast<uint16*>(sourceIndexData->indexBuffer->lock( + sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY + )); + uint16 *sourceEnd = source + sourceIndexData->indexCount; + + //And copy it to the output buffer + while (source != sourceEnd) { + *indexBuffer16++ = static_cast<uint16>(*source++ + indexOffset); + } + + //Unlock the input buffer + sourceIndexData->indexBuffer->unlock(); + + //Increment the index offset + indexOffset += sourceVertexData->vertexCount; + } + } + + //Unlock buffers + indexData->indexBuffer->unlock(); + for (Ogre::ushort i = 0; i < vertBinding->getBufferCount(); ++i) + vertBinding->getBuffer(i)->unlock(); + + //Clear mesh queue + meshQueue.clear(); + + built = true; +} + +void BatchedGeometry::SubBatch::clear() +{ + //If built, delete the batch + if (built){ + //Delete buffers + indexData->indexBuffer.setNull(); + vertexData->vertexBufferBinding->unsetAllBindings(); + + //Reset vertex/index count + vertexData->vertexStart = 0; + vertexData->vertexCount = 0; + indexData->indexStart = 0; + indexData->indexCount = 0; + } + + //Clear mesh queue + meshQueue.clear(); + + built = false; +} + +void BatchedGeometry::SubBatch::addSelfToRenderQueue(RenderQueue *queue, uint8 group) +{ + if (built){ + //Update material technique based on camera distance + assert(!material.isNull()); + bestTechnqiue = material->getBestTechnique(material->getLodIndexSquaredDepth(parent->minDistanceSquared)); + + //Add to render queue + queue->addRenderable(this, group); + } +} + +void BatchedGeometry::SubBatch::getRenderOperation(RenderOperation& op) +{ + op.operationType = RenderOperation::OT_TRIANGLE_LIST; + op.srcRenderable = this; + op.useIndexes = true; + op.vertexData = vertexData; + op.indexData = indexData; +} + +Real BatchedGeometry::SubBatch::getSquaredViewDepth(const Camera* cam) const +{ + Vector3 camVec = cam->getDerivedPosition() - parent->center; + return camVec.squaredLength(); +} + +#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR <= 2 +//Dagon-compatible getLights() +const Ogre::LightList& BatchedGeometry::SubBatch::getLights(void) const +{ + return parent->sceneNode->findLights(parent->radius); +} +#else +//Eihort-compatible getLights() +const Ogre::LightList& BatchedGeometry::SubBatch::getLights(void) const +{ + return parent->queryLights(); +} +#endif Added: trunk/python-ogre/ThirdParty/forests/BatchedGeometry.h =================================================================== --- trunk/python-ogre/ThirdParty/forests/BatchedGeometry.h (rev 0) +++ trunk/python-ogre/ThirdParty/forests/BatchedGeometry.h 2007-10-13 13:35:58 UTC (rev 417) @@ -0,0 +1,122 @@ +/*------------------------------------------------------------------------------------- +Copyright (c) 2006 John Judnich + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------------*/ + +//BatchedGeometry.h +//A "lightweight" version of Ogre::StaticGeometry, which gives you a little more control +//over the batch materials, etc. +//------------------------------------------------------------------------------------- + +#ifndef __BatchedGeometry_H__ +#define __BatchedGeometry_H__ + +#include "OgrePrerequisites.h" +#include "OgreMovableObject.h" +#include "OgreSceneNode.h" +#include "OgreMaterialManager.h" + + +class BatchedGeometry: public Ogre::MovableObject +{ +public: + BatchedGeometry(Ogre::SceneManager *mgr); + ~BatchedGeometry(); + + void addEntity(Ogre::Entity *ent, const Ogre::Vector3 &position, const Ogre::Quaternion &orientation = Ogre::Quaternion::IDENTITY, const Ogre::Vector3 &scale = Ogre::Vector3::UNIT_SCALE, const Ogre::ColourValue &color = Ogre::ColourValue::White); + void build(); + void clear(); + + void _notifyCurrentCamera(Ogre::Camera *cam); + void _updateRenderQueue(Ogre::RenderQueue *queue); + bool isVisible(); + const Ogre::AxisAlignedBox &getBoundingBox(void) const { return bounds; } + Ogre::Real getBoundingRadius(void) const { return radius; } + const Ogre::String &getMovableType(void) const { static Ogre::String t = "BatchedGeometry"; return t; } + + class SubBatch: public Ogre::Renderable + { + public: + SubBatch(BatchedGeometry *parent, Ogre::SubMesh *mesh); + ~SubBatch(); + + void addSubMesh(Ogre::SubMesh *mesh, const Ogre::Vector3 &position, const Ogre::Quaternion &orientation, const Ogre::Vector3 &scale, const Ogre::ColourValue &color = Ogre::ColourValue::White); + void build(); + void clear(); + + void setMaterial(Ogre::MaterialPtr &mat) { material = mat; } + void setMaterialName(const Ogre::String &mat) { material = Ogre::MaterialManager::getSingleton().getByName(mat); } + inline Ogre::String getMaterialName() const { return material->getName(); } + + void addSelfToRenderQueue(Ogre::RenderQueue *queue, Ogre::uint8 group); + void getRenderOperation(Ogre::RenderOperation& op); + Ogre::Real getSquaredViewDepth(const Ogre::Camera* cam) const; + const Ogre::LightList& getLights(void) const; + + Ogre::Technique *getTechnique() const { return bestTechnqiue; } + const Ogre::MaterialPtr &getMaterial(void) const { return material; } + void getWorldTransforms(Ogre::Matrix4* xform) const { *xform = parent->_getParentNodeFullTransform(); } + const Ogre::Quaternion& getWorldOrientation(void) const { return parent->sceneNode->_getDerivedOrientation(); } + const Ogre::Vector3& getWorldPosition(void) const { return parent->sceneNode->_getDerivedPosition(); } + bool castsShadows(void) const { return parent->getCastShadows(); } + + private: + //A structure defining the desired position/orientation/scale of a batched mesh. The + //SubMesh is not specified since that can be determined by which MeshQueue this belongs to. + struct QueuedMesh + { + Ogre::SubMesh *mesh; + Ogre::Vector3 position; + Ogre::Quaternion orientation; + Ogre::Vector3 scale; + Ogre::ColourValue color; + }; + + bool built; + + Ogre::VertexData *vertexData; + Ogre::IndexData *indexData; + + Ogre::SubMesh *meshType; + BatchedGeometry *parent; + Ogre::MaterialPtr material; + Ogre::Technique *bestTechnqiue; //This is recalculated every frame + + typedef std::vector<QueuedMesh>::iterator MeshQueueIterator; + typedef std::vector<QueuedMesh> MeshQueue; + MeshQueue meshQueue; //The list of meshes to be added to this batch + }; + +private: + Ogre::String getFormatString(Ogre::SubMesh *mesh); + + typedef std::map<Ogre::String, SubBatch*> SubBatchMap; //Stores a list of GeomBatch'es, using a format string (generated with getGeometryFormatString()) as the key value + SubBatchMap subBatchMap; + + Ogre::Vector3 center; + Ogre::AxisAlignedBox bounds; + bool boundsUndefined; + Ogre::Real radius; + + Ogre::SceneManager *sceneMgr; + Ogre::SceneNode *sceneNode; + + Ogre::Real minDistanceSquared; + bool withinFarDistance; + + bool built; + +public: + typedef Ogre::MapIterator<SubBatchMap> SubBatchIterator; + SubBatchIterator getSubBatchIterator() const; +}; + + + + +#endif \ No newline at end of file Added: trunk/python-ogre/ThirdParty/forests/GrassLoader.cpp =================================================================== --- trunk/python-ogre/ThirdParty/forests/GrassLoader.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/forests/GrassLoader.cpp 2007-10-13 13:35:58 UTC (rev 417) @@ -0,0 +1,807 @@ +/*------------------------------------------------------------------------------------- +Copyright (c) 2006 John Judnich + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------------*/ + +#include "GrassLoader.h" +#include "PagedGeometry.h" +#include "PropertyMaps.h" + +#include "OgreRoot.h" +#include "OgreTimer.h" +#include "OgreCamera.h" +#include "OgreVector3.h" +#inclu... [truncated message content] |
From: <and...@us...> - 2007-10-11 13:50:13
|
Revision: 416 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=416&view=rev Author: andy_miller Date: 2007-10-11 06:50:16 -0700 (Thu, 11 Oct 2007) Log Message: ----------- Updated caelum demo Modified Paths: -------------- trunk/python-ogre/demos/caelum/Demo_Caelum01.py Modified: trunk/python-ogre/demos/caelum/Demo_Caelum01.py =================================================================== --- trunk/python-ogre/demos/caelum/Demo_Caelum01.py 2007-10-11 13:13:35 UTC (rev 415) +++ trunk/python-ogre/demos/caelum/Demo_Caelum01.py 2007-10-11 13:50:16 UTC (rev 416) @@ -8,8 +8,9 @@ import ogre.io.OIS as ois import ogre.addons.caelum as caelum import SampleFramework as sf +import sys +import ctypes - ## ------------------------------------------------------------------ ## our basic Python Ogre TerrainFrame Listener ## ------------------------------------------------------------------ @@ -21,7 +22,7 @@ self.sceneManager = sceneManager self.camera = camera self.moveSpeed = 50.0 - + self.updateRay = ogre.Ray() ## basic terrain ray query pos = camera.getPosition() d = ogre.Vector3.NEGATIVE_UNIT_Y @@ -34,18 +35,17 @@ ret = sf.FrameListener.frameStarted(self, frameEvent) ## clamp camera to terrain - updateRay = ogre.Ray() - updateRay.setOrigin (self.camera.getPosition()) - updateRay.setDirection (ogre.Vector3.NEGATIVE_UNIT_Y) - self.raySceneQuery.Ray = updateRay + self.updateRay.setOrigin (self.camera.getPosition()) + self.updateRay.setDirection (ogre.Vector3.NEGATIVE_UNIT_Y) + self.raySceneQuery.Ray = self.updateRay for queryResult in self.raySceneQuery.execute(): if queryResult.worldFragment is not None: pos = self.camera.getPosition() self.camera.setPosition (pos.x, pos.y - queryResult.distance + 10.0, pos.z) break -## mCamera->setPosition(mCamera->getPosition().x, -## i->worldFragment->singleIntersection.y + 10, -## mCamera->getPosition().z); +## mCamera.setPosition(mCamera.getPosition().x, +## i.worldFragment.singleIntersection.y + 10, +## mCamera.getPosition().z) return ret @@ -57,58 +57,65 @@ TerrainFrameListener.__init__(self, renderWindow, camera, sceneManager) self.caelumSystem = caelumSystem - self.speedFactor = caelumSystem.getUniversalClock().getTimeScale() + self.speedFactor = 0 self.paused = False - self.timeTillNextUpdate = 0.0 + self.timeTillNextUpdate = 0 self.PostFiltering = False - + + self.UpdateSpeedFactor(self.caelumSystem.getUniversalClock ().getTimeScale ()) + ## ------------------------------------------------------------------ ## our own function to set time scale dependent on paused state ## saves a few if / else ## ------------------------------------------------------------------ - def _setTimeScale(self, paused, t1, t2 ): - t = t1 - if not paused: - t = t2 - self.caelumSystem.getUniversalClock().setTimeScale(t) +# def _setTimeScale(self, paused, t1, t2 ): +# t = t1 +# if not paused: +# t = t2 +# self.caelumSystem.getUniversalClock().setTimeScale(t) + + ## Update speed factors. + def UpdateSpeedFactor(self, factor): + self.speedFactor = factor + if self.paused: + t = 0 + else: + t= self.speedFactor + self.caelumSystem.getUniversalClock ().setTimeScale (t) + ogre.ControllerManager.getSingleton().setTimeFactor (t) - ## ------------------------------------------------------------------ def frameStarted(self, frameEvent): # clamp to terrain ret = TerrainFrameListener.frameStarted(self, frameEvent) - t = self.caelumSystem.getUniversalClock().getCurrentRelativeTime() - self.caelumSystem.getSun().getSunPositionModel().setJulianDate(t) - + t = self.caelumSystem.getSun().getSunPositionModel() + espm = caelum.castAsEarthSunPositionModel ( t ) + + if espm : + espm.setJulianDate (self.caelumSystem.getUniversalClock ().getCurrentRelativeTime ()) + self.timeTillNextUpdate-= frameEvent.timeSinceLastFrame ## keyboard input if (self.timeTillNextUpdate<= 0): if (self.Keyboard.isKeyDown (ois.KC_SPACE)): - self.timeTillNextUpdate = 1 - self._setTimeScale(self.paused, self.speedFactor, 0) self.paused = not self.paused + self.UpdateSpeedFactor(self.speedFactor) if (self.Keyboard.isKeyDown(ois.KC_X)): - self.timeTillNextUpdate = 0.25 - self.speedFactor *= 0.5 - self._setTimeScale(self.paused, 0, self.speedFactor) + self.UpdateSpeedFactor(self.speedFactor/2) if (self.Keyboard.isKeyDown(ois.KC_C)): - self.timeTillNextUpdate = 0.25 - self.speedFactor *= 2 - self._setTimeScale(self.paused, 0, self.speedFactor) + self.UpdateSpeedFactor(self.speedFactor*2) if (self.Keyboard.isKeyDown(ois.KC_Z)): - self.timeTillNextUpdate = 1 - self.speedFactor *= -1 - self._setTimeScale(self.paused, 0, self.speedFactor) + self.UpdateSpeedFactor(self.speedFactor * -1) if (self.Keyboard.isKeyDown(ois.KC_F1)): self.timeTillNextUpdate = 1 @@ -116,6 +123,7 @@ self.PostFiltering = False else: self.PostFiltering = True + ogre.CompositorManager.getSingleton().setCompositorEnabled (self.window.getViewport (0), "Bloom", self.postFiltering) ## EXTRA! Update the haze sun light position mat = ogre.MaterialManager.getSingleton().getByName("CaelumDemoTerrain") @@ -149,18 +157,19 @@ ## Sun dtor deletes the SunPositionalModel. However in createScene we ## need to hold a reference to SunPositionModel (self.spm) other ## seg faults when it goes out of scope. Doing so means that a seg fault - ## when C++ tries to delete the sun->EarthSunPositionModel. Temp workaround + ## when C++ tries to delete the sun.EarthSunPositionModel. Temp workaround ## comment out the following in Sun.cpp and handle deletion ouselves. ## ## /* - ## if (mSunPositionModel) { - ## delete mSunPositionModel; - ## mSunPositionModel = 0; - ## } + ## if (mSunPositionModel) { + ## delete mSunPositionModel + ## mSunPositionModel = 0 + ## } ## */ ## ## ==================================================================== - self.spm = None + if self.spm: + self.spm = 0 if self.caelumSystem: self.caelumSystem.shutdown(False) self.caelumSystem = None @@ -184,58 +193,72 @@ def _createScene(self): sceneManager = self.sceneManager camera = self.camera - - ogre.CompositorManager.getSingleton().addCompositor(self.renderWindow.getViewport(0),"Bloom") + clouds = True + skyDome = True + + ## a little hack to let me test this on a machine with a crap graphics card + capabilities = ogre.Root.getSingleton().getRenderSystem().capabilities + if not capabilities.hasCapability(ogre.RSC_VERTEX_PROGRAM) or\ + not capabilities.hasCapability(ogre.RSC_FRAGMENT_PROGRAM): + skyDome = False + clouds = False + else: + ogre.CompositorManager.getSingleton().addCompositor(self.renderWindow.getViewport(0),"Bloom") camera.setNearClipDistance(0.01) ## Initialise Caelum - self.caelumSystem = caelum.CaelumSystem(self.root, self.sceneManager) - self.spm = caelum.EarthSunPositionModel(ogre.Radian(ogre.Degree(37)), 0.5) - - ## Setup lighting parameters. - self.caelumSystem.getSun().setAmbientMultiplier(ogre.ColourValue(0.5, 0.5, 0.5)) - self.caelumSystem.getSun().setDiffuseMultiplier(ogre.ColourValue(3, 3, 2.7)) + try: + self.caelumSystem = caelum.CaelumSystem(self.root, self.sceneManager + ,createSkyDome=skyDome, createClouds=clouds + ) + except RuntimeError, e: + print "\nError occured when creating the CaelumSystem - do you have a graphics card that supports vertex programs?\n" + sys.exit(-1) + except: + print "Exception Occured:", sys.exc_info()[0] + sys.exit(-1) + + ## Setup sun position model. + self.spm = caelum.SimpleSunPositionModel (ogre.Degree (13)) + ## IMHO EarthSunPositionModel is broken, so it default to sspm. + ##caelum.SunPositionModel *spm = new caelum.EarthSunPositionModel (ogre.Radian (ogre.Degree (37)), 0.5) + + ## Setup sun options + self.caelumSystem.getSun ().setAmbientMultiplier (ogre.ColourValue(0.5, 0.5, 0.5)) + self.caelumSystem.getSun ().setDiffuseMultiplier (ogre.ColourValue(3, 3, 2.7)) ## For green terrain: - ## self.caelumSystem.getSun().setDiffuseMultiplier(ogre.ColourValue(0.1, 3, 0.1)) - - self.caelumSystem.getSun().setSpecularMultiplier(ogre.ColourValue(5, 5, 5)) - self.caelumSystem.getSun().setSunPositionModel(self.spm) - self.caelumSystem.getSun().setManageAmbientLight(True) - - - ## Create and configure the sky colours model to use - self.caelumModel = caelum.StoredImageElvBasedSkyColourModel() - ## Call this before changing the gradients image!! - self.caelumSystem.setSkyColourModel(self.caelumModel) - - self.caelumModel.setSkyGradientsImage("EarthClearSky2.png") + ##self.caelumSystem.getSun ().setDiffuseMultiplier (ogre.ColourValue(0.1, 3, 0.1)) + self.caelumSystem.getSun ().setSpecularMultiplier (ogre.ColourValue(5, 5, 5)) + self.caelumSystem.getSun ().setSunPositionModel (self.spm) + self.caelumSystem.getSun ().setManageAmbientLight (True) + + ## Basic fogging setup. + ## This is a hack until proper fogging is implemented. + self.caelumSystem.getSkyColourModel().setFogDensityMultiplier(0.0015) self.caelumSystem.setManageFog(True) - self.caelumModel.setFogDensity(0.0015) + + ## Setup cloud options + if clouds: + self.caelumSystem.getClouds ().setCloudSpeed(ogre.Vector2(-0.00001, 0.00001)) + + ## Setup starfield options + self.caelumSystem.getStarfield ().setInclination (ogre.Degree (13)) + + ## Set some time parameters + self.caelumSystem.getUniversalClock ().setTimeScale (512) + self.caelumSystem.getUniversalClock ().setCurrentTime (18000) ## Jan 1st, 5am - ## Create a starfield - self.caelumSystem.getStarfield().setInclination(ogre.Degree (13)) - self.caelumSystem.createStarfield("Starfield.jpg") ## Register all to the render window self.renderWindow.addListener(self.caelumSystem) - ## Set some time parameters - #t = time(&t); - #struct tm *t2 = localtime (&t); - - self.caelumSystem.getUniversalClock().setTimeScale(512) - ## Jan 1st, 5am - self.caelumSystem.getUniversalClock().setCurrentTime(18000) - + ## Put some terrain in the scene terrain_cfg = "terrain.cfg" - #if ogre.OGRE_PLATFORM == ogre.OGRE_PLATFORM_APPLE: - # terrain_cfg = resourcePath + terrain_cfg self.sceneManager.setWorldGeometry( terrain_cfg ) - ##self.sceneManager.setAmbientLight(ogre.ColourValue.Black) + - def _createFrameListener(self): # pass # return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-11 13:13:32
|
Revision: 415 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=415&view=rev Author: andy_miller Date: 2007-10-11 06:13:35 -0700 (Thu, 11 Oct 2007) Log Message: ----------- Updated Caelum Modified Paths: -------------- trunk/python-ogre/ThirdParty/caelum/Caelum.h trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp trunk/python-ogre/ThirdParty/caelum/SkyDome.h trunk/python-ogre/ThirdParty/caelum/Starfield.cpp trunk/python-ogre/ThirdParty/caelum/Starfield.h trunk/python-ogre/ThirdParty/caelum/Sun.cpp trunk/python-ogre/ThirdParty/caelum/Sun.h trunk/python-ogre/code_generators/caelum/generate_code.py trunk/python-ogre/code_generators/caelum/hand_made_wrappers.py Added Paths: ----------- trunk/python-ogre/ThirdParty/caelum/LayeredClouds.cpp trunk/python-ogre/ThirdParty/caelum/LayeredClouds.h trunk/python-ogre/ThirdParty/caelum/SkyColourModel.cpp Removed Paths: ------------- trunk/python-ogre/ThirdParty/caelum/StoredImageElvBasedSkyColourModel.cpp trunk/python-ogre/ThirdParty/caelum/StoredImageElvBasedSkyColourModel.h trunk/python-ogre/ThirdParty/caelum/StoredImageSkyColourModel.cpp trunk/python-ogre/ThirdParty/caelum/StoredImageSkyColourModel.h Modified: trunk/python-ogre/ThirdParty/caelum/Caelum.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/Caelum.h 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/Caelum.h 2007-10-11 13:13:35 UTC (rev 415) @@ -12,10 +12,9 @@ #include "SimpleSunPositionModel.h" #include "SkyColourModel.h" #include "SkyDome.h" -#include "StoredImageSkyColourModel.h" -#include "StoredImageElvBasedSkyColourModel.h" #include "Sun.h" #include "SunPositionModel.h" +#include "LayeredClouds.h" #include "UniversalClock.h" #endif //CAELUM_H Modified: trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h 2007-10-11 13:13:35 UTC (rev 415) @@ -4,20 +4,7 @@ // Include external headers #include "Ogre.h" -// Define the dll export qualifier if compiling for Windows -// // #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 -// // #ifdef CAELUM_LIB -// // #define DllExport __declspec (dllexport) -// // #else -// // #ifdef __MINGW32__ -// // #define DllExport -// // #else -// // #define DllExport __declspec (dllimport) -// // #endif -// // #endif -// // #else - #define DllExport -// // #endif +#define DllExport // Define the version code #define CAELUM_VERSION_MAIN 0 @@ -25,12 +12,27 @@ #define CAELUM_VERSION_TER 1 #define CAELUM_VERSION = (CAELUM_VERSION_MAIN << 16) | (CAELUM_VERSION_SEC << 8) | CAELUM_VERSION_TER -/* Set a global camera distances modifier for the clipping distance. - This threshold will be substracted from the far clipping distance if applicable, else it will be - added to the near clipping distance (ie, if infinite far clipping distance is used). - */ -#define CAMERA_DISTANCE_MODIFIER 0.1 +namespace caelum { + /// Resource group name for caelum resources. + extern DllExport Ogre::String RESOURCE_GROUP_NAME; + /* Set a global camera distances modifier for the clipping distance. + This threshold will be substracted from the far clipping distance if applicable, else it will be + added to the near clipping distance (ie, if infinite far clipping distance is used). + */ + const float CAMERA_DISTANCE_MODIFIER = 0; + + // Render grounp for caelum stuff + // It's best to have them all together + enum CaelumRenderQueueGroupId + { + CAELUM_RENDER_QUEUE_STARFIELD = Ogre::RENDER_QUEUE_SKIES_EARLY + 0, + CAELUM_RENDER_QUEUE_SKYDOME = Ogre::RENDER_QUEUE_SKIES_EARLY + 1, + CAELUM_RENDER_QUEUE_SUN = Ogre::RENDER_QUEUE_SKIES_EARLY + 2, + CAELUM_RENDER_QUEUE_CLOUDS = Ogre::RENDER_QUEUE_SKIES_EARLY + 3, + }; +} + // Log macro #define LOG(msg) Ogre::LogManager::getSingleton().logMessage(msg); Modified: trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp 2007-10-11 13:13:35 UTC (rev 415) @@ -3,19 +3,28 @@ namespace caelum { -Ogre::String CaelumSystem::RESOURCE_GROUP_NAME = "Caelum"; +// Default resource group name is Caelum +Ogre::String RESOURCE_GROUP_NAME = "Caelum"; -CaelumSystem::CaelumSystem (Ogre::Root *root, - Ogre::SceneManager *sceneMgr, - bool manageResGroup, - const Ogre::String &resGroupName, - bool createSkyDome, bool createSun, bool createStarfield) { +CaelumSystem::CaelumSystem +( + Ogre::Root *root, + Ogre::SceneManager *sceneMgr, + bool createSkyColourModel, + bool createSkyDome, + bool createSun, + bool createStarfield, + bool createClouds, + bool manageResGroup, + const Ogre::String &resGroupName +): + mCleanup(false) +{ LOG ("Initialising Caelum system..."); mOgreRoot = root; mSceneMgr = sceneMgr; mCleanup = false; - RESOURCE_GROUP_NAME = resGroupName; // Create resource group @@ -23,19 +32,18 @@ // Search for the resource group Ogre::StringVector resGroups = Ogre::ResourceGroupManager::getSingleton ().getResourceGroups (); Ogre::StringVector::iterator it = resGroups.begin (), iend = resGroups.end (); - while (it != iend && *it != resGroupName) + while (it != iend && *it != resGroupName) { ++it; + } if (it == iend) { Ogre::ResourceGroupManager::getSingleton ().createResourceGroup (RESOURCE_GROUP_NAME); mManageResourceGroup = true; LOG (Ogre::String ("Created Caelum resource group (") + RESOURCE_GROUP_NAME + ")"); - } - else { + } else { mManageResourceGroup = false; } - } - else { + } else { mManageResourceGroup = false; } @@ -45,18 +53,26 @@ // Set-up attributes mManageFog = false; - mSkyDome = 0; - mSun = 0; - mStarfield = 0; LOG ("System attributes set up."); + assert(getSun() == 0); + assert(getClouds() == 0); // Create basic elements - if (createSkyDome) - this->createSkyDome (); - if (createSun) - this->createSun (); - if (createStarfield) - this->createStarfield (); + if (createSkyColourModel) { + this->setSkyColourModel (new SkyColourModel ()); + } + if (createSkyDome) { + this->setSkyDome (new SkyDome (mSceneMgr)); + } + if (createSun) { + this->setSun (new Sun (mSceneMgr)); + } + if (createClouds) { + this->setClouds (new LayeredClouds (mSceneMgr)); + } + if (createStarfield) { + this->setStarfield (new Starfield (mSceneMgr)); + } // Auto-register itself as a frame listener mOgreRoot->addFrameListener (this); @@ -77,9 +93,10 @@ mListeners.clear (); // Destroy the elements - destroySkyDome (); - destroySun (); - destroyStarfield (); + setSkyDome (0); + setSun (0); + setStarfield (0); + setClouds (0); // Destroy the clock if (mUniversalClock) { @@ -93,10 +110,11 @@ LOG ("Destroyed Caelum resource group"); } - if (cleanup) + if (cleanup) { delete this; - else + } else { mCleanup = true; + } } void CaelumSystem::addListener (CaelumListener *listener) { @@ -110,17 +128,21 @@ void CaelumSystem::preViewportUpdate (const Ogre::RenderTargetViewportEvent &e) { Ogre::Camera *cam = e.source->getCamera (); - if (mSkyDome) { - mSkyDome->notifyCameraChanged (cam); + if (getSkyDome ()) { + getSkyDome ()->notifyCameraChanged (cam); } - if (mSun) { - mSun->notifyCameraChanged (cam); + if (getSun ()) { + getSun ()->notifyCameraChanged (cam); } - if (mStarfield) { - mStarfield->notifyCameraChanged (cam); + if (getStarfield ()) { + getStarfield ()->notifyCameraChanged (cam); } + + if (getClouds ()) { + getClouds ()->notifyCameraChanged (cam); + } } UniversalClock *CaelumSystem::getUniversalClock () const { @@ -139,118 +161,63 @@ if (!fireStartedEvent (e)) return false; - if (mSun) { - mSun->update (mUniversalClock->getCurrentRelativeDayTime ()); + // Get relative time of the day. + float relDayTime = mUniversalClock->getCurrentRelativeDayTime (); + + // Get the sun's direction. + Ogre::Vector3 sunDir; + if (getSun ()) { + sunDir = getSun ()->getSunDirection(); + } else { + sunDir = Ogre::Vector3::UNIT_Y; + } + + if (getSun ()) { + getSun ()->update (relDayTime); } - if (mStarfield) { - mStarfield->update (mUniversalClock->getCurrentRelativeDayTime ()); + if (getStarfield ()) { + getStarfield ()->update (relDayTime); } - if (mSkyDome) { - mSkyDome->updateSkyDomeMaterialTime (mSkyColourModel, mUniversalClock->getCurrentRelativeDayTime (), mSun); - - mSkyDome->setSunDirection (mSun->getSunDirection ()); + if (getSkyDome ()) { + getSkyDome ()->setSunDirection (sunDir); } if (mManageFog) { // TODO: Fog stuff here!!! - if (mSkyColourModel) { + if (getSkyColourModel ()) { mSceneMgr->setFog (Ogre::FOG_EXP2, - mSkyColourModel->getFogColour (mUniversalClock->getCurrentRelativeDayTime (), mSun ? mSun->getSunDirection() : Ogre::Vector3::UNIT_Y) * 0.7, - mSkyColourModel->getFogDensity (mUniversalClock->getCurrentRelativeDayTime (), mSun ? mSun->getSunDirection() : Ogre::Vector3::UNIT_Y)); + mSkyColourModel->getFogColour (relDayTime, sunDir) * 0.7, + mSkyColourModel->getFogDensity (relDayTime, sunDir)); } } - if (mSun) { - if (mSkyColourModel) - mSun->setSunColour (mSkyColourModel->getSunColour (mUniversalClock->getCurrentRelativeDayTime (), mSun->getSunDirection ())); - else - mSun->setSunColour (mSceneMgr->getFogColour ()); + // Set sun colours. + if (getSun () && getSkyColourModel ()) { + mSun->setSunSphereColour (getSkyColourModel ()->getSunSphereColour (relDayTime, sunDir)); + mSun->setSunLightColour (getSkyColourModel ()->getSunLightColour (relDayTime, sunDir)); } // Call every listener before quiting - if (!fireFinishedEvent (e)) + if (!fireFinishedEvent (e)) { return false; + } } - return true; -} - -SkyDome *CaelumSystem::createSkyDome () { - if (!mSkyDome) { - mSkyDome = new SkyDome (mSceneMgr); - LOG ("Sky Dome created."); + // This has to be moved out of here, but Universal clock doesn't calculate deltaT + if (getClouds()) { + double time = mUniversalClock->getCurrentRelativeDayTime (); + Ogre::Vector3 sunDir = getSun() ? mSun->getSunDirection() : Ogre::Vector3::UNIT_Y; + mClouds->update (e.timeSinceLastFrame * mUniversalClock->getTimeScale(), + getSun () ? mSun->getSunDirection() : Ogre::Vector3::UNIT_Y, + getSun () ? mSun->getSunLightColour() : Ogre::ColourValue::White, + getSkyColourModel() ? mSkyColourModel->getFogColour (time, sunDir) : Ogre::ColourValue::Black); } - return mSkyDome; + return true; } -SkyDome *CaelumSystem::getSkyDome () const { - return mSkyDome; -} - -void CaelumSystem::destroySkyDome () { - if (mSkyDome) { - delete mSkyDome; - mSkyDome = 0; - LOG ("Sky Dome destroyed."); - } -} - -Sun *CaelumSystem::createSun () { - if (!mSun) { - mSun = new Sun (mSceneMgr); - LOG ("Sun created."); - } - - return mSun; -} - -Sun *CaelumSystem::getSun () const { - return mSun; -} - -void CaelumSystem::destroySun () { - if (mSun) { - delete mSun; - mSun = 0; - LOG ("Sun destroyed."); - } -} - -Starfield *CaelumSystem::createStarfield (const Ogre::String &mapName) { - if (!mStarfield) { - mStarfield = new Starfield (mSceneMgr); - LOG ("Starfield created."); - } - - mStarfield->updateMaterial (mapName); - - return mStarfield; -} - -Starfield *CaelumSystem::getStarfield () const { - return mStarfield; -} - -void CaelumSystem::destroyStarfield () { - if (mStarfield) { - delete mStarfield; - mStarfield = 0; - LOG ("Starfield destroyed."); - } -} - -void CaelumSystem::setSkyColourModel (SkyColourModel *model) { - mSkyColourModel = model; - if (mSkyDome) { - Ogre::TextureUnitState *temp = mSkyDome->getTextureUnitState (); - if (temp) - mSkyColourModel->setSkyGradientsTextureUnitState (temp); - } -} - void CaelumSystem::setManageFog (bool manage) { mManageFog = manage; } Modified: trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h 2007-10-11 13:13:35 UTC (rev 415) @@ -8,6 +8,7 @@ #include "SkyColourModel.h" #include "SkyDome.h" #include "Starfield.h" +#include "LayeredClouds.h" #include "Sun.h" namespace caelum { @@ -18,11 +19,6 @@ */ class DllExport CaelumSystem : public Ogre::FrameListener, public Ogre::RenderTargetListener { // Attributes ----------------------------------------------------------------- - public: - /** Common resource group name. - */ - static Ogre::String RESOURCE_GROUP_NAME; - private: /** Root of the Ogre engine. */ @@ -46,27 +42,31 @@ /// Reference to the universal clock. UniversalClock *mUniversalClock; + + /** Flag to indicate if Caelum should manage the fog or not. + */ + bool mManageFog; /** The sky dome. */ - SkyDome *mSkyDome; + std::auto_ptr<SkyDome> mSkyDome; - /** Reference to the sky colour model in use. + /** Reference to the sun. */ - SkyColourModel *mSkyColourModel; + std::auto_ptr<Sun> mSun; - /** Flag to indicate if Caelum should manage the fog or not. + /** Reference to the clouds. */ - bool mManageFog; + std::auto_ptr<LayeredClouds> mClouds; - /** Reference to the sun. + /** Reference to the starfield. */ - Sun *mSun; + std::auto_ptr<Starfield> mStarfield; - /** Reference to the starfield. + /** Reference to the sky colour model in use. */ - Starfield *mStarfield; - + std::auto_ptr<SkyColourModel> mSkyColourModel; + // Methods -------------------------------------------------------------------- public: /** Constructor. @@ -75,15 +75,17 @@ @param sceneMgr The Ogre scene manager. @param manageResGroup Tells the system if the resource group has been created externally (true) or if it's to be managed by the system. @param resGroupName The resource group name, if it's desired to use an existing one or just a different name. - @param createSkyDome Whether if the sky dome should be created or not. - @param createSun Whether if the sun should be created or not. - @param createStarfield Whether if the starfield should be created or not. */ - CaelumSystem (Ogre::Root *root, - Ogre::SceneManager *sceneMgr, - bool manageResGroup = true, - const Ogre::String &resGroupName = RESOURCE_GROUP_NAME, - bool createSkyDome = true, bool createSun = true, bool createStarfield = true); + CaelumSystem ( + Ogre::Root *root, + Ogre::SceneManager *sceneMgr, + bool createSkyColourModel = true, + bool createSkyDome = true, + bool createSun = true, + bool createStarfield = true, + bool createClouds = true, + bool manageResGroup = true, + const Ogre::String &resGroupName = RESOURCE_GROUP_NAME); /** Destructor. */ @@ -125,57 +127,72 @@ */ bool frameStarted (const Ogre::FrameEvent &e); - /** Creates the sky dome, or returns the existing one if any yet. + /** Set the skydome. + * @param dome A new dome or null to disable. */ - SkyDome *createSkyDome (); + inline void setSkyDome (SkyDome *dome) { + mSkyDome.reset(dome); + } /** Returns the current sky dome. - @return The current sky dome. */ - SkyDome *getSkyDome () const; + SkyDome *getSkyDome () const { + return mSkyDome.get(); + } - /** Destroys the sky dome. - @remarks Remember to detach the sky dome from every viewport it is attached to before destroying it! + /** Set the sun. + * @param sun A new sun or null to disable. */ - void destroySkyDome (); + inline void setSun (Sun* sun) { + mSun.reset(sun); + } - /** Creates the sun. - @return The sun. - */ - Sun *createSun (); - /** Gets the current sun. @return The sun in use. */ - Sun *getSun () const; + Sun* getSun () const { + return mSun.get(); + } - /** Destroys the sun. - */ - void destroySun (); + /** Set the starfield. + * @param starfield A new starfield or null to disable. + */ + inline void setStarfield (Starfield* starfield) { + mStarfield.reset(starfield); + } - /** Create the starfield. - @note Returns the existing one if there's one already in use. - @note The old texture will be replaced by the passed one. - @param mapName Name of the starfield texture bitmap. - @return The new or current starfield. - */ - Starfield *createStarfield (const Ogre::String &mapName = "Starfield.jpg"); + /** Gets the current starfield. + */ + inline Starfield* getStarfield () const { + return mStarfield.get(); + } - /** Gets the starfield. - @return The starfield. - */ - Starfield *getStarfield () const; + /** Set the cloud system + * @param clouds A new cloud system or null to disable. + */ + inline void setClouds (LayeredClouds* clouds) { + mClouds.reset(clouds); + } - /** Destroys the current starfield. - @remark Remember to detach it from every viewport before deleting! - */ - void destroyStarfield (); + /** Get the current cloud system. + */ + inline LayeredClouds* getClouds () const { + return mClouds.get(); + } /** Sets the sky colour model to be used. - @param model The sky colour model. + * @param model The sky colour model, or null to disable */ - void setSkyColourModel (SkyColourModel *model); + inline void setSkyColourModel (SkyColourModel *model) { + mSkyColourModel.reset(model); + } + /** Get the current sky colour model. + */ + inline SkyColourModel* getSkyColourModel () const { + return mSkyColourModel.get(); + } + /** Enables/disables the Caelum fog management. @param manage True if you want Caelum to manage the fog for you. */ Modified: trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp 2007-10-11 13:13:35 UTC (rev 415) @@ -1,10 +1,9 @@ #include "CaelumPrecompiled.h" #include "GeometryFactory.h" -#include "CaelumSystem.h" namespace caelum { -void GeometryFactory::generateSphericDome (const Ogre::String &name, const unsigned int segments, DomeType type) { +void GeometryFactory::generateSphericDome (const Ogre::String &name, int segments, DomeType type) { // Return now if already exists if (Ogre::MeshManager::getSingleton ().resourceExists (name)) return; @@ -12,7 +11,7 @@ LOG ("Creating " + name + " sphere mesh resource..."); // Use the mesh manager to create the mesh - Ogre::MeshPtr msh = Ogre::MeshManager::getSingleton ().createManual (name, CaelumSystem::RESOURCE_GROUP_NAME); + Ogre::MeshPtr msh = Ogre::MeshManager::getSingleton ().createManual (name, RESOURCE_GROUP_NAME); // Create a submesh Ogre::SubMesh *sub = msh->createSubMesh (); @@ -87,7 +86,7 @@ LOG ("DONE"); } -void GeometryFactory::fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments) { +void GeometryFactory::fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, int segments) { const float deltaLatitude = Ogre::Math::PI / (float )segments; const float deltaLongitude = Ogre::Math::PI * 2.0 / (float )segments; @@ -160,7 +159,7 @@ } } -void GeometryFactory::fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments) { +void GeometryFactory::fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, int segments) { const float deltaLatitude = Ogre::Math::PI / (float )segments; const float deltaLongitude = Ogre::Math::PI * 2.0 / (float )segments; Modified: trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h 2007-10-11 13:13:35 UTC (rev 415) @@ -24,7 +24,7 @@ @param segments The number of sphere segments. @param type The type of sky dome to create. */ - static void generateSphericDome (const Ogre::String &name, const unsigned int segments, DomeType type = DT_GRADIENTS); + static void generateSphericDome (const Ogre::String &name, int segments, DomeType type = DT_GRADIENTS); private: /** Fills the vertex and index buffers for a sky gradients type dome. @@ -32,14 +32,14 @@ @param pIndices Pointer to the index buffer. @param segments Subdivision detail. */ - static void fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments); + static void fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, int segments); /** Fills the vertex and index buffers for a stardield type dome. @param pVertex Pointer to the vertex buffer. @param pIndices Pointer to the index buffer. @param segments Subdivision detail. */ - static void fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments); + static void fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, int segments); }; } // namespace caelum Added: trunk/python-ogre/ThirdParty/caelum/LayeredClouds.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/LayeredClouds.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/LayeredClouds.cpp 2007-10-11 13:13:35 UTC (rev 415) @@ -0,0 +1,199 @@ +#include "CaelumPrecompiled.h" +#include "LayeredClouds.h" +#include "CaelumExceptions.h" + +namespace +{ + /** Extend a Vector2 to a Vector3 by appending a 0 + */ + inline Ogre::Vector3 extend(Ogre::Vector2 vec) + { + return Ogre::Vector3(vec.x, vec.y, 0); + } +} + +namespace caelum +{ + LayeredClouds::LayeredClouds + ( + Ogre::SceneManager* scene, + const Ogre::String &resourceGroupName, + const Ogre::String &materialName, + const Ogre::String &meshName, + const Ogre::String &entityName + ): + mSceneMgr(scene) + { + // Create cloud plane mesh if it doesn't exist. + if (Ogre::MeshManager::getSingleton ().getByName (meshName).isNull ()) { + Ogre::Plane plane = Ogre::Plane(Ogre::Vector3::NEGATIVE_UNIT_Y, -0.1); + Ogre::MeshManager::getSingleton ().createCurvedPlane( + meshName, resourceGroupName, plane, 2, 2, .4, 16, 16, + false, 1, 1, 1, Ogre::Vector3::UNIT_Z); + } + + // Create cloud plane entity. + mEntity = mSceneMgr->createEntity(entityName, meshName); + mEntity->setMaterialName(materialName); + mEntity->setCastShadows(false); + mEntity->setRenderQueueGroup (CAELUM_RENDER_QUEUE_CLOUDS); + + mNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (); + mNode->attachObject (mEntity); + + // It would be better to create the material at runtime instead. + // More consistent with the rest of Caelum. + mMaterial = static_cast<Ogre::MaterialPtr>( + Ogre::MaterialManager::getSingleton().getByName(materialName)); + mMaterial->load(); + if (mMaterial->getBestTechnique() == 0) { + throw new UnsupportedException (0, "Layered cloud material not supported.", + "LayeredClouds", "LayeredClouds.cpp", -1); + } + getFpParams()->setIgnoreMissingParams(true); + getVpParams()->setIgnoreMissingParams(true); + + // Default parameter values + setCloudCover(0.5); + setCloudMassOffset(Ogre::Vector2(0, 0)); + setCloudDetailOffset(Ogre::Vector2(0, 0)); + + setAnimating(true); + setCloudMassBlend(0.5); + setCloudBlendTime(100); + setCloudSpeed(Ogre::Vector2(0, 0)); + } + + LayeredClouds::~LayeredClouds() { + mNode->detachObject(mEntity); + mSceneMgr->destroyEntity(mEntity); + mEntity = 0; + static_cast<Ogre::SceneNode*>(mNode->getParent())-> + removeAndDestroyChild(mNode->getName()); + mNode = 0; + mSceneMgr = 0; + } + + void LayeredClouds::notifyCameraChanged (Ogre::Camera *cam) { + mNode->setPosition (cam->getRealPosition ()); + if (cam->getFarClipDistance () > 0) { + mNode->setScale (Ogre::Vector3::UNIT_SCALE * (cam->getFarClipDistance () - CAMERA_DISTANCE_MODIFIER)); + } else { + mNode->setScale (Ogre::Vector3::UNIT_SCALE * (cam->getNearClipDistance () + CAMERA_DISTANCE_MODIFIER)); + } + } + + Ogre::GpuProgramParametersSharedPtr LayeredClouds::getVpParams() { + return mMaterial->getBestTechnique()->getPass(0)->getVertexProgramParameters(); + } + + Ogre::GpuProgramParametersSharedPtr LayeredClouds::getFpParams() { + return mMaterial->getBestTechnique()->getPass(0)->getFragmentProgramParameters(); + } + + void LayeredClouds::update(Ogre::Real timePassed, + const Ogre::Vector3 &sunDirection, + const Ogre::ColourValue &sunColour, + const Ogre::ColourValue &fogColour) + { + // Set sun parameters. + setSunDirection(sunDirection); + setSunColour(sunColour); + setFogColour(fogColour); + + if (isAnimating()) { + // Move clouds. + setCloudMassOffset(getCloudMassOffset() + timePassed * getCloudSpeed()); + setCloudDetailOffset(getCloudDetailOffset() - timePassed * getCloudSpeed()); + + // Animate cloud blending. + double blend = getCloudMassBlend(); + blend += timePassed / getCloudBlendTime(); + blend = fmod(blend, 1); + if (blend < 0) { + blend = 1 - blend; + } + setCloudMassBlend(blend); + } + } + + bool LayeredClouds::isAnimating () const { + return mAnimating; + } + + void LayeredClouds::setAnimating (bool animating) { + mAnimating = animating; + } + + void LayeredClouds::setCloudSpeed(const Ogre::Vector2 &cloudSpeed) { + mCloudSpeed = cloudSpeed; + } + + Ogre::Vector2 LayeredClouds::getCloudSpeed() const { + return mCloudSpeed; + } + + void LayeredClouds::setCloudBlendTime(const Ogre::Real cloudBlendTime) { + static const Ogre::String animTextures1[4] = { + "Noise1.png", "Noise2.png", "Noise3.png", "Noise4.png" + }; + static const Ogre::String animTextures2[4] = { + "Noise2.png", "Noise3.png", "Noise4.png", "Noise1.png" + }; + + Ogre::Pass* pass = mMaterial->getBestTechnique()->getPass(0); + pass->getTextureUnitState(0)->setAnimatedTextureName(animTextures1, 4, cloudBlendTime * 4); + pass->getTextureUnitState(1)->setAnimatedTextureName(animTextures2, 4, cloudBlendTime * 4); + setCloudMassBlend(0); + mCloudBlendTime = cloudBlendTime; + } + + Ogre::Real LayeredClouds::getCloudBlendTime() const { + return mCloudBlendTime; + } + + void LayeredClouds::setSunDirection(const Ogre::Vector3 &sunDirection) { + getVpParams()->setNamedConstant("sunDirection", sunDirection); + getFpParams()->setNamedConstant("sunDirection", sunDirection); + } + + void LayeredClouds::setSunColour(const Ogre::ColourValue &sunColour) { + getFpParams()->setNamedConstant("sunColour", sunColour); + } + + void LayeredClouds::setFogColour(const Ogre::ColourValue &fogColour) { + getFpParams()->setNamedConstant("fogColour", fogColour); + } + + void LayeredClouds::setCloudMassOffset(const Ogre::Vector2 &cloudMassOffset) { + getFpParams()->setNamedConstant("cloudMassOffset", extend(mCloudMassOffset = cloudMassOffset)); + } + + Ogre::Vector2 LayeredClouds::getCloudMassOffset() const { + return mCloudMassOffset; + } + + void LayeredClouds::setCloudMassBlend(const Ogre::Real cloudMassBlend) { + getFpParams()->setNamedConstant("cloudMassBlend", mCloudMassBlend = cloudMassBlend); + } + + Ogre::Real LayeredClouds::getCloudMassBlend() const { + return mCloudMassBlend; + } + + void LayeredClouds::setCloudDetailOffset(const Ogre::Vector2 &cloudDetailOffset) { + getFpParams()->setNamedConstant("cloudDetailOffset", extend(mCloudDetailOffset = cloudDetailOffset)); + } + + Ogre::Vector2 LayeredClouds::getCloudDetailOffset() const { + return mCloudDetailOffset; + } + + void LayeredClouds::setCloudCover(const Ogre::Real cloudCover) { + getFpParams()->setNamedConstant("cloudCover", mCloudCover = cloudCover); + } + + Ogre::Real LayeredClouds::getCloudCover() const { + return mCloudCover; + } +} // namespace caelum Added: trunk/python-ogre/ThirdParty/caelum/LayeredClouds.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/LayeredClouds.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/LayeredClouds.h 2007-10-11 13:13:35 UTC (rev 415) @@ -0,0 +1,175 @@ +#ifndef LAYEREDCLOUDS_H +#define LAYEREDCLOUDS_H + +#include "CaelumPrerequisites.h" + +namespace caelum { + +/** Class for layered clouds. + * @note This is tighly integrated with LayeredCloud.cg and LayeredClouds.material. + * There are two "cloud mass" layers blended to create animating clouds and an extra + * detailLayer. + * Most of the parameters in this class are direct wrappers from GPU shader params. + * + * Cloud offsets and speeds are not in any meaningful world units. Maybe they should + * be in radians or something? + */ +class DllExport LayeredClouds { + public: + /** Standard constructor. + * @param scene: Scene to add cloud dome to. This class takes control + * of the scene's skydome. + * @param material: Name of the material to load. It would be a lot + * more consistent to generate the material in code. + */ + LayeredClouds ( + Ogre::SceneManager* scene, + const Ogre::String &resourceGroupName="Caelum", + const Ogre::String &materialName="CaelumLayeredClouds", + const Ogre::String &meshName="CaelumLayeredClouds", + const Ogre::String &entityName="CaelumLayeredClouds"); + + ~LayeredClouds (); + + /** Update cloud material. + * @param timePassed Time passed since last update. + * @param sunDirection Vector towards the sun. + * @param sunColour Colour of the sun. + */ + void update ( + Ogre::Real timePassed, + const Ogre::Vector3& sunDirection, + const Ogre::ColourValue& sunColour, + const Ogre::ColourValue& fogColour); + + /// Handle camera change. + virtual void notifyCameraChanged (Ogre::Camera *cam); + + /** Sets cloud cover, between 0 (completely clear) and 1 (completely covered) + * @param cloudCover Cloud cover between 0 and 1 + */ + void setCloudCover (const Ogre::Real cloudCover); + + /** Gets the current cloud cover. + * @return Cloud cover, between 0 and 1 + */ + Ogre::Real getCloudCover () const; + + /** Sets blending factor between the two cloud mass layers. + */ + void setCloudMassBlend (const Ogre::Real cloudCover); + + /** Gets the current blending factor between the two cloud mass layers + */ + Ogre::Real getCloudMassBlend () const; + + /** Sets current offset(translation) of the cloud mass on the sky. + */ + void setCloudMassOffset (const Ogre::Vector2 &cloudMassOffset); + + /** Gets current offset(translation) of the cloud mass on the sky. + */ + Ogre::Vector2 getCloudMassOffset () const; + + /** Sets current offset(translation) of cloud details on the sky. + */ + void setCloudDetailOffset (const Ogre::Vector2 &cloudMassOffset); + + /** Gets current offset(translation) of cloud details on the sky. + */ + Ogre::Vector2 getCloudDetailOffset () const; + + + /** If the cloud layer is animating itself. + * @note If this is true then parameters like cloudMassBlend and offsets + * are set every update(). + */ + bool isAnimating () const; + + /** Switch internal animation on/off + */ + void setAnimating (bool animating); + + /** Sets cloud movement speed. + * @param cloudSpeed Cloud movement speed. + */ + void setCloudSpeed (const Ogre::Vector2 &cloudSpeed); + + /** Gets cloud movement speed. + * @param cloudSpeed Cloud movement speed. + */ + Ogre::Vector2 getCloudSpeed () const; + + /** Sets the time it takes to blend two cloud shaped together, in seconds. + * @param cloudCover Cloud shape blend time in seconds + */ + void setCloudBlendTime (const Ogre::Real cloudBlendTime); + + /** Gets the time it takes to blend two cloud shaped together, in seconds. + * @return Cloud shape blend time in seconds + */ + Ogre::Real getCloudBlendTime () const; + + private: + /// Shortcut function for fragment program parameters + Ogre::GpuProgramParametersSharedPtr getFpParams(); + + /// Shortcut function for fragment program parameters + Ogre::GpuProgramParametersSharedPtr getVpParams(); + + /// Set the sunDirection parameter in the shaders. + void setSunDirection(const Ogre::Vector3 &sunDirection); + + /// Set the sunColour parameter in the shaders. + void setSunColour(const Ogre::ColourValue &sunColour); + + /// Set the fogColour parameter in the shaders. + void setFogColour(const Ogre::ColourValue &fogColour); + + /// Sets inverse Haze height. + void setInvHazeHeight (const Ogre::Real invHazeHeight); + + /// Current cloud coverage + Ogre::Real mCloudCover; + + /// Current cloud blend factor + Ogre::Real mCloudMassBlend; + + /// Current cloud layer offset. + Ogre::Vector2 mCloudMassOffset; + + /// Current cloud detail layer offset. + Ogre::Vector2 mCloudDetailOffset; + + + /// If this class controls animation for itself. + bool mAnimating; + + /// Current cloud blend time. + Ogre::Real mCloudBlendTime; + + /** If true then CloudMassBlend is increased in animation; otherwise it's + * decreased. This is changed each time it reaches the end. + */ + bool mCloudBlendAnimationDirection; + + /// Current cloud speed + Ogre::Vector2 mCloudSpeed; + + + /// Cloud material + Ogre::MaterialPtr mMaterial; + + /// Cloud plane mesh + Ogre::SceneNode *mNode; + + /// Cloud plane entity + Ogre::Entity *mEntity; + + /// Reference to scene manager. + Ogre::SceneManager *mSceneMgr; +}; + +}; // namespace caelum + +#endif // LAYEREDCLOUDS_H Added: trunk/python-ogre/ThirdParty/caelum/SkyColourModel.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SkyColourModel.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/SkyColourModel.cpp 2007-10-11 13:13:35 UTC (rev 415) @@ -0,0 +1,113 @@ +#include "CaelumPrecompiled.h" +#include "SkyColourModel.h" + +namespace caelum { + +SkyColourModel::SkyColourModel +( + const Ogre::String &gradients, + const Ogre::String &sunColours +): + mSunColoursImage(0), + mSkyGradientsImage(0) +{ + mSkyGradientsImage = 0; + mFogDensityMultiplier = 1; + setSkyGradientsImage(gradients); + setSunColoursImage(sunColours); +} + +SkyColourModel::~SkyColourModel () { + if (mSkyGradientsImage != 0) { + delete mSkyGradientsImage; + mSkyGradientsImage = 0; + } + if (mSunColoursImage != 0) { + delete mSunColoursImage; + mSunColoursImage = 0; + } +} + +void SkyColourModel::setSkyGradientsImage (const Ogre::String &filename) { + if (mSkyGradientsImage != 0) { + delete mSkyGradientsImage; + mSkyGradientsImage = 0; + } + + mSkyGradientsImage = new Ogre::Image (); + mSkyGradientsImage->load (filename, RESOURCE_GROUP_NAME); +} + +void SkyColourModel::setSunColoursImage (const Ogre::String &filename) { + if (mSunColoursImage != 0) { + delete mSunColoursImage; + mSunColoursImage = 0; + } + + mSunColoursImage = new Ogre::Image (); + mSunColoursImage->load (filename, RESOURCE_GROUP_NAME); +} + +Ogre::ColourValue SkyColourModel::getFogColour (float time, const Ogre::Vector3 &sunDir) { + float elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y) * 0.5 + 0.5; + Ogre::ColourValue col = getInterpolatedColour (elevation, 1, mSkyGradientsImage, false); + return col; +} + +float SkyColourModel::getFogDensity (float time, const Ogre::Vector3 &sunDir) { + float elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y) * 0.5 + 0.5; + Ogre::ColourValue col = getInterpolatedColour (elevation, 1, mSkyGradientsImage, false); + return col.a * mFogDensityMultiplier; +} + +Ogre::ColourValue SkyColourModel::getSunSphereColour (float time, const Ogre::Vector3 &sunDir) { + float elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y); + elevation = elevation * 2 + 0.4; + + if (mSunColoursImage == 0) { + return Ogre::ColourValue::White; + } else { + return getInterpolatedColour (elevation, 1, mSunColoursImage, false); + } +} + +Ogre::ColourValue SkyColourModel::getSunLightColour (float time, const Ogre::Vector3 &sunDir) { + float elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y) * 0.5 + 0.5; + + // Hack: return averaged sky colours + Ogre::ColourValue col = getInterpolatedColour (elevation, elevation, mSkyGradientsImage); + return Ogre::ColourValue::White * (col.r + col.g + col.b) / 3; +} + +Ogre::ColourValue SkyColourModel::getInterpolatedColour (float x, float height, Ogre::Image *img, bool wrap) { + // Get the image width + int width = static_cast<int>(img->getWidth ()) - 1; + + // calculate the height + height = Ogre::Math::Abs (height); + int y = (int )((img->getHeight () - 1) * height); + if (y >= static_cast<int>(img->getHeight ())) + y--; + + // Get the two closest pixels + int curPix, auxPix; + float diff; + curPix = (int )(width * x); + diff = width * x - curPix; + if (diff < 0) { + auxPix = curPix - 1; + } + else { + auxPix = curPix + 1; + } + + // Calculate the interpolated pixel + Ogre::ColourValue c1, c2, cf; + c1 = img->getColourAt (wrap ? curPix % width : curPix < 0 ? 0 : curPix > width ? width : curPix, y, 0); + c2 = img->getColourAt (wrap ? auxPix % width : auxPix < 0 ? 0 : auxPix > width ? width : auxPix, y, 0); + cf = c1 * (1 - diff) + c2 * diff; + + return cf; +} + +} // namespace caelum Modified: trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h 2007-10-11 13:13:35 UTC (rev 415) @@ -5,70 +5,91 @@ namespace caelum { -/** Sky colour model interface. - @author Jes\xFAs Alonso Abad - @version 0.1 +/** Class which returns various sky colours. + * This is based on the same gradients as the skydome. + * It would be nice to split it into multiple components. + * Functions take a "time" parameter but only elevation is actually used. */ class DllExport SkyColourModel { // Attributes ----------------------------------------------------------------- - protected: - /** A reference to the sky gradients texture unit state. - */ - Ogre::TextureUnitState *mSkyGradientsTextureUnitState; - + private: /** The sky gradients image (for lookups). */ Ogre::Image *mSkyGradientsImage; + /** The sun gradients image (for lookups). + */ + Ogre::Image *mSunColoursImage; + + /** Multiplier for fog densities obtained from the sky gradients image. + */ + float mFogDensityMultiplier; + // Methods -------------------------------------------------------------------- public: - /** Constructor method. + /** Constructor method. */ - SkyColourModel () { - mSkyGradientsTextureUnitState = 0; - mSkyGradientsImage = 0; - } + SkyColourModel ( + const Ogre::String &skyGradients = "EarthClearSky2.png", + const Ogre::String &sunColours = "SunGradient.png" + ); /** Destructor. */ - virtual ~SkyColourModel () {} + virtual ~SkyColourModel (); - /** Sets the sky gradients texture unit in use. - @param tus The TextureUnitState to be modified. - */ - void setSkyGradientsTextureUnitState (Ogre::TextureUnitState *tus) { - mSkyGradientsTextureUnitState = tus; - } - /** Gets the fog colour for a certain daytime. @param time The current time. @param sunDir The sun direction. @return The fog colour. */ - virtual Ogre::ColourValue getFogColour (float time, const Ogre::Vector3 &sunDir) = 0; + Ogre::ColourValue getFogColour (float time, const Ogre::Vector3 &sunDir); /** Gets the fog density for a certain daytime. @param time The current time. @param sunDir The sun direction. @return The fog density. */ - virtual float getFogDensity (float time, const Ogre::Vector3 &sunDir) = 0; + float getFogDensity (float time, const Ogre::Vector3 &sunDir); - /** Gets the sun colour for a certain daytime. - @param time The current time. - @param sunDir The sun direction. - @return The sun colour. + inline float getFogDensityMultiplier() { + return mFogDensityMultiplier; + } + + inline void setFogDensityMultiplier(float value) { + mFogDensityMultiplier = value; + } + + /** Get the colour of the sun sphere. + * This colour is used to draw the sun sphere in the sky. + * @return The colour of the sun. */ - virtual Ogre::ColourValue getSunColour (float time, const Ogre::Vector3 &sunDir) = 0; + Ogre::ColourValue getSunSphereColour (float time, const Ogre::Vector3 &sunDir); - /** Updates the sky colour material, according to various factors. - @param fpp The material fragment program parameters (null if it's not supported) - @param vpp The material vertex program parameters (null if it's not supported) - @param time The local daytime, ranging [0, 1] - @param sunDir The sun light direction. - @return True if everything went fine. + /** Gets the colour of sun light. + * This color is used to illuminate the scene. + * @return The colour of the sun's light */ - virtual bool updateMaterial (Ogre::GpuProgramParametersSharedPtr fpp, Ogre::GpuProgramParametersSharedPtr vpp, float time, const Ogre::Vector3 &sunDir) = 0; + Ogre::ColourValue getSunLightColour (float time, const Ogre::Vector3 &sunDir); + + /// Set the sun gradients image. + /// resources/EarthClearSky2.png is the default image; but you can supply another + void setSkyGradientsImage (const Ogre::String &filename); + + /// Set the sun colours image. + /// Sun colour is taken from this image. + /// 'resources/SunGradient.png' is the default image; but you can supply another + void setSunColoursImage (const Ogre::String &filename); + + protected: + /** Gets the interpolated colour between two pixels from an image. + @param x The horizontal coordinate in the range [0, 1]. + @param height The height at which the pixels are located in the range [0, 1] (will be converted to integer). + @param img The lookup image. + @param wrap If the map wraps horizontally or not. + @return The interpolated colour. + */ + static Ogre::ColourValue getInterpolatedColour (float x, float height, Ogre::Image *img, bool wrap = true); }; } // namespace caelum Modified: trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp 2007-10-11 13:13:35 UTC (rev 415) @@ -1,12 +1,11 @@ #include "CaelumPrecompiled.h" #include "SkyDome.h" -#include "CaelumSystem.h" #include "GeometryFactory.h" #include "CaelumExceptions.h" namespace caelum { -const Ogre::String SkyDome::mSphericDomeResourceName = "CaelumSphericDome"; +const Ogre::String SkyDome::SPHERIC_DOME_NAME = "CaelumSphericDome"; const Ogre::String SkyDome::SKY_DOME_MATERIAL_NAME = "CaelumSkyDomeMaterial"; SkyDome::SkyDome (Ogre::SceneManager *sceneMgr) { @@ -14,10 +13,10 @@ createSkyDomeMaterial (); - GeometryFactory::generateSphericDome (mSphericDomeResourceName, 32); - Ogre::Entity *ent = sceneMgr->createEntity ("Dome", mSphericDomeResourceName); + GeometryFactory::generateSphericDome (SPHERIC_DOME_NAME, 32); + Ogre::Entity *ent = sceneMgr->createEntity ("Dome", SPHERIC_DOME_NAME); ent->setMaterialName (SKY_DOME_MATERIAL_NAME); - ent->setRenderQueueGroup (Ogre::RENDER_QUEUE_SKIES_EARLY + 2); + ent->setRenderQueueGroup (CAELUM_RENDER_QUEUE_SKYDOME); ent->setCastShadows (false); mNode = sceneMgr->getRootSceneNode ()->createChildSceneNode (); @@ -41,10 +40,13 @@ void SkyDome::notifyCameraChanged (Ogre::Camera *cam) { mNode->setPosition (cam->getRealPosition ()); if (mAutoRadius) { - if (cam->getFarClipDistance () > 0) - mNode->setScale (Ogre::Vector3::UNIT_SCALE * (cam->getFarClipDistance () - CAMERA_DISTANCE_MODIFIER)); - else - mNode->setScale (Ogre::Vector3::UNIT_SCALE * (cam->getNearClipDistance () + CAMERA_DISTANCE_MODIFIER)); + if (cam->getFarClipDistance () > 0) { + mNode->setScale (Ogre::Vector3::UNIT_SCALE * ( + cam->getFarClipDistance () - CAMERA_DISTANCE_MODIFIER)); + } else { + mNode->setScale (Ogre::Vector3::UNIT_SCALE * ( + cam->getNearClipDistance () + CAMERA_DISTANCE_MODIFIER)); + } } } @@ -52,18 +54,25 @@ if (radius > 0) { mNode->setScale (Ogre::Vector3::UNIT_SCALE * radius); mAutoRadius = false; - } - else { + } else { mAutoRadius = true; } } -void SkyDome::setSunDirection (Ogre::Vector3 dir) { - if (!mSkyDomeMaterial.isNull ()) { - if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { - mSkyDomeMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ()->setNamedConstant ("sunDirection", dir); - } - } +void SkyDome::setSunDirection (Ogre::Vector3 sunDir) { + float elevation = sunDir.dotProduct (Ogre::Vector3::UNIT_Y); + elevation = elevation * 0.5 + 0.5; + + Ogre::GpuProgramParametersSharedPtr vpParams = + mMaterial->getBestTechnique()->getPass(0)->getVertexProgramParameters(); + Ogre::GpuProgramParametersSharedPtr fpParams = + mMaterial->getBestTechnique()->getPass(0)->getFragmentProgramParameters(); + Ogre::TextureUnitState* gradientsTus = + mMaterial->getBestTechnique()->getPass(0)->getTextureUnitState(0); + + vpParams->setNamedConstant ("sunDirection", sunDir); + fpParams->setNamedConstant ("offset", elevation); + gradientsTus->setTextureUScroll (elevation); } void SkyDome::setLightAbsorption (float absorption) const { @@ -72,84 +81,82 @@ else if (absorption < 0) absorption = 0; - if (!mSkyDomeMaterial.isNull ()) { - if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { - mSkyDomeMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ()->setNamedConstant ("lightAbsorption", absorption); - } - } + Ogre::GpuProgramParametersSharedPtr vpParams = + mMaterial->getBestTechnique()->getPass(0)->getVertexProgramParameters(); + vpParams->setNamedConstant ("lightAbsorption", absorption); } void SkyDome::setLightScattering (float scattering) const { if (scattering <= 0) scattering = 0.00001; - if (!mSkyDomeMaterial.isNull ()) { - if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { - mSkyDomeMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ()->setNamedConstant ("lightInvScattering", 1.0f / scattering); - } - } + Ogre::GpuProgramParametersSharedPtr fpParams = + mMaterial->getBestTechnique()->getPass(0)->getFragmentProgramParameters(); + fpParams->setNamedConstant ("lightInvScattering", 1.0f / scattering); } void SkyDome::setAtmosphereHeight (float height) const { - if (height <= 0) + if (height <= 0) { height = 0.00001; - else if (height > 1) + } else if (height > 1) { height = 1; + } - if (!mSkyDomeMaterial.isNull ()) { - if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { - mSkyDomeMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ()->setNamedConstant ("atmosphereInvHeight", 1.0f / height); - } - } + Ogre::GpuProgramParametersSharedPtr fpParams = + mMaterial->getBestTechnique()->getPass(0)->getFragmentProgramParameters(); + fpParams->setNamedConstant ("atmosphereInvHeight", 1.0f / height); } -void SkyDome::updateSkyDomeMaterialTime (SkyColourModel *skyColourModel, float time, Sun *sun) { - skyColourModel->updateMaterial (mSkyDomeMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters (), - mSkyDomeMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters (), - time, - sun ? sun->getSunDirection () : Ogre::Vector3::UNIT_Y); +void SkyDome::setSkyGradientsImage (const Ogre::String& gradients) { + Ogre::TextureUnitState* gradientsTus = + mMaterial->getTechnique (0)->getPass (0)->getTextureUnitState(0); + + gradientsTus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP); + + // Dagon and Eihort compatibility + #if OGRE_VERSION < ((1 << 16) | (3 << 8)) + gradientsTus->setTextureName (gradients, Ogre::TEX_TYPE_2D, -1, true); + #else + gradientsTus->setTextureName (gradients, Ogre::TEX_TYPE_2D); + gradientsTus->setIsAlpha (true); + #endif } -Ogre::TextureUnitState *SkyDome::getTextureUnitState () { - if (mSkyDomeMaterial.isNull ()) - return 0; +void SkyDome::setAtmosphereDepthImage (const Ogre::String& atmosphereDepth) { + Ogre::TextureUnitState* atmosphereTus = + mMaterial->getTechnique (0)->getPass (0)->getTextureUnitState(1); - return mSkyDomeMaterial->getTechnique (0)->getPass (0)->getTextureUnitState (0); + atmosphereTus->setTextureName (atmosphereDepth, Ogre::TEX_TYPE_1D); + atmosphereTus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP, Ogre::TextureUnitState::TAM_WRAP, Ogre::TextureUnitState::TAM_WRAP); } void SkyDome::createSkyDomeMaterial () { - Ogre::MaterialPtr mat; - - // Check support - if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_FRAGMENT_PROGRAM)) { - // TODO: Check if the profiles used are supported + // Check shader support. + // It would be nice to check supported profiles in detail. + if (!Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_FRAGMENT_PROGRAM)) { + throw new UnsupportedException (0, "The card doesn't support fragment programs for the sky dome material.", "SkyDome", "SkyDome.cpp", -1); } - else { - throw new UnsupportedException (0, "The card doesn't support the sky dome material. Fragment programs are used.", "SkyDome", "SkyDome.cpp", -1); + if (!Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { + throw new UnsupportedException (0, "The card doesn't support vertex programs for the sky dome material.", "SkyDome", "SkyDome.cpp", -1); } - if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { - // TODO: Check if the profiles used are supported - } - else { - throw new UnsupportedException (0, "The card doesn't support the sky dome material. Vertex programs are used.", "SkyDome", "SkyDome.cpp", -1); - } LOG ("Generating sky dome material..."); if (!Ogre::MaterialManager::getSingleton ().resourceExists (SKY_DOME_MATERIAL_NAME)) { LOG ("\tMaterial not found; creating..."); - mat = static_cast<Ogre::MaterialPtr>(Ogre::MaterialManager::getSingleton ().create (SKY_DOME_MATERIAL_NAME, CaelumSystem::RESOURCE_GROUP_NAME)); - mat->setReceiveShadows (false); + mMaterial = static_cast<Ogre::MaterialPtr>(Ogre::MaterialManager::getSingleton ().create (SKY_DOME_MATERIAL_NAME, RESOURCE_GROUP_NAME)); + mMaterial->setReceiveShadows (false); LOG ("\t\tMaterial [OK]"); - Ogre::Pass *pass = mat->getTechnique (0)->getPass (0); + + Ogre::Pass *pass = mMaterial->getTechnique (0)->getPass (0); pass->setSceneBlending (Ogre::SBT_TRANSPARENT_ALPHA); pass->setDepthCheckEnabled (false); pass->setDepthWriteEnabled (false); pass->setLightingEnabled (false); pass->setFog (true); - // Bind the sky light absorption shader if capable to - // TODO + + // Bind fragment program. if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_FRAGMENT_PROGRAM)) { - Ogre::HighLevelGpuProgramPtr fp = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram ("SkyDomeFP", CaelumSystem::RESOURCE_GROUP_NAME, "cg", Ogre::GPT_FRAGMENT_PROGRAM); + Ogre::HighLevelGpuProgramPtr fp = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram ("SkyDomeFP", RESOURCE_GROUP_NAME, "cg", Ogre::GPT_FRAGMENT_PROGRAM); fp->setSourceFile ("CaelumShaders.cg"); fp->setParameter ("entry_point", "SkyDome_fp"); fp->setParameter ("profiles", "ps_2_0 arbfp1"); @@ -158,8 +165,10 @@ parameters->setNamedConstant ("offset", 0.0f); parameters->setNamedAutoConstant ("hazeColour", Ogre::GpuProgramParameters::ACT_FOG_COLOUR); } + + // Bind vertex program. if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { - Ogre::HighLevelGpuProgramPtr vp = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram ("SkyDomeVP", CaelumSystem::RESOURCE_GROUP_NAME, "cg", Ogre::GPT_VERTEX_PROGRAM); + Ogre::HighLevelGpuProgramPtr vp = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram ("SkyDomeVP", RESOURCE_GROUP_NAME, "cg", Ogre::GPT_VERTEX_PROGRAM); vp->setSourceFile ("CaelumShaders.cg"); vp->setParameter ("entry_point", "SkyDome_vp"); vp->setParameter ("profiles", "vs_2_0 arbvp1"); @@ -169,40 +178,41 @@ parameters->setNamedConstant ("sunDirection", Ogre::Vector3 (1, 0, 0)); } LOG ("\t\tPass [OK]"); - Ogre::TextureUnitState *tus = pass->createTextureUnitState (); - tus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_WRAP, Ogre::TextureUnitState::TAM_CLAMP, Ogre::TextureUnitState::TAM_CLAMP); + + // Create first texture unit; gradients image. + pass->createTextureUnitState (); + setSkyGradientsImage("EarthClearSky2.png"); LOG ("\t\tTextureUnit - Sky gradient [OK]"); - tus = pass->createTextureUnitState (); - tus->setTextureName ("AtmosphereDepth.png", Ogre::TEX_TYPE_1D); - tus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP, Ogre::TextureUnitState::TAM_WRAP, Ogre::TextureUnitState::TAM_WRAP); + + // Create second texture unit; atmosphere depth image. + pass->createTextureUnitState (); + setAtmosphereDepthImage("AtmosphereDepth.png"); LOG ("\t\tTextureUnit - Atmosphere depth [OK]"); - mat->load (); + + mMaterial->load (); LOG ("\tDONE"); + } else { + mMaterial = static_cast<Ogre::MaterialPtr>(Ogre::MaterialManager::getSingleton ().getByName (SKY_DOME_MATERIAL_NAME)); } - else { - mat = static_cast<Ogre::MaterialPtr>(Ogre::MaterialManager::getSingleton ().getByName (SKY_DOME_MATERIAL_NAME)); - } LOG ("DONE"); - - mSkyDomeMaterial = mat; } void SkyDome::destroySkyDomeMaterial () { LOG ("Removing sky dome material..."); - if ((Ogre::HighLevelGpuProgramManager::getSingletonPtr()->resourceExists("SkyLightAbsorptionFP"))) { - LOG ("Removing sky dome SkyLightAbsorptionFP..."); - Ogre::HighLevelGpuProgramManager::getSingletonPtr()->remove("SkyLightAbsorptionFP"); + if ((Ogre::HighLevelGpuProgramManager::getSingletonPtr()->resourceExists("SkyDomeFP"))) { + LOG ("Removing sky dome SkyDomeFP..."); + Ogre::HighLevelGpuProgramManager::getSingletonPtr()->remove("SkyDomeFP"); } - if ((Ogre::HighLevelGpuProgramManager::getSingletonPtr()->resourceExists("SkyLightAbsorptionVP"))) { - LOG ("Removing sky dome SkyLightAbsorptionVP..."); - Ogre::HighLevelGpuProgramManager::getSingletonPtr()->remove("SkyLightAbsorptionVP"); + if ((Ogre::HighLevelGpuProgramManager::getSingletonPtr()->resourceExists("SkyDomeVP"))) { + LOG ("Removing sky dome SkyDomeVP..."); + Ogre::HighLevelGpuProgramManager::getSingletonPtr()->remove("SkyDomeVP"); } if (!Ogre::MaterialManager::getSingleton ().resourceExists (SKY_DOME_MATERIAL_NAME)) { Ogre::MaterialManager::getSingleton ().remove (SKY_DOME_MATERIAL_NAME); } - mSkyDomeMaterial.setNull (); + mMaterial.setNull (); LOG ("DONE"); } Modified: trunk/python-ogre/ThirdParty/caelum/SkyDome.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SkyDome.h 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/SkyDome.h 2007-10-11 13:13:35 UTC (rev 415) @@ -3,7 +3,6 @@ #include "CaelumPrerequisites.h" #include "CameraBoundElement.h" -#include "SkyColourModel.h" #include "Sun.h" namespace caelum { @@ -13,31 +12,31 @@ */ class DllExport SkyDome : public CameraBoundElement { // Attributes ----------------------------------------------------------------- - protected: + private: /** Control scene node. */ Ogre::SceneNode *mNode; /** Name of the spheric dome resource. */ - static const Ogre::String mSphericDomeResourceName; + static const Ogre::String SPHERIC_DOME_NAME; /** Name of the dome material. */ static const Ogre::String SKY_DOME_MATERIAL_NAME; - /** Reference to the sky dome material. - */ - Ogre::MaterialPtr mSkyDomeMaterial; + /// Reference to the sky dome material. + Ogre::MaterialPtr mMaterial; // Methods -------------------------------------------------------------------- public: - /** Constructor (DO NOT USE! Use CaelumSystem::createSkyDome instead). - @param sceneMgr The scene manager where this sky dome will be created. + /** Constructor + * This will setup some nice defaults. + * @param sceneMgr The scene manager where this sky dome will be created. */ SkyDome (Ogre::SceneManager *sceneMgr); - /** Destructor (DO NOT USE! Use CaelumSystem::destroySkyDome instead). + /** Destructor */ virtual ~SkyDome (); @@ -48,7 +47,7 @@ /** @copydoc CameraBoundElement::setFarRadius(). */ void setFarRadius (float radius); - + /** Sets the sun direction. @param dir The sun light direction. */ @@ -69,17 +68,11 @@ */ void setAtmosphereHeight (float height) const; - /** Updates the sky dome material to match the local time. - @param skyColourModel The sky colour model in use. - @param time The local time. - @param sun The sun. - */ - void updateSkyDomeMaterialTime (SkyColourModel *skyColourModel, float time, Sun *sun); + /// Set the sky color gradients image. + void setSkyGradientsImage (const Ogre::String& gradients); - /** Returns the sky dome texture unit state. - @return The texture unit state of the sky dome material. - */ - Ogre::TextureUnitState *getTextureUnitState (); + /// Set the atmosphere depthh gradient image. + void setAtmosphereDepthImage (const Ogre::String& gradients); private: /** Internal method to create the sky dome material. Modified: trunk/python-ogre/ThirdParty/caelum/Starfield.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/Starfield.cpp 2007-10-10 02:21:29 UTC (rev 414) +++ trunk/python-ogre/ThirdParty/caelum/Starfield.cpp 2007-10-11 13:13:35 UTC (rev 415) @@ -1,23 +1,24 @@ #include "CaelumPrecompiled.h" #include "Starfield.h" -#include "CaelumSystem.h" #include "GeometryFactory.h" namespace caelum { -const Ogre::String Starfield::mStarfieldDomeResourceName = "CaelumStarfieldDome"; +const Ogre::String Starfield::STARFIELD_DOME_NAME = "CaelumStarfieldDome"; + const Ogre::String Starfield::STARFIELD_MATERIAL_NAME = "CaelumStarfieldMaterial"; -Starfield::Starfield (Ogre::SceneManager *sceneMgr) { +Starfield::Starfield (Ogre::SceneMan... [truncated message content] |
From: <and...@us...> - 2007-10-10 02:21:28
|
Revision: 414 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=414&view=rev Author: andy_miller Date: 2007-10-09 19:21:29 -0700 (Tue, 09 Oct 2007) Log Message: ----------- Much better wrapping of Bullet and OgreBullet (was missing some base classes) Ogre handles SceneManager set and getOption functionality Modified Paths: -------------- trunk/python-ogre/code_generators/bullet/generate_code.py trunk/python-ogre/code_generators/bullet/hand_made_wrappers.py trunk/python-ogre/code_generators/ogre/generate_code.py trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py trunk/python-ogre/code_generators/ogrebulletc/generate_code.py Added Paths: ----------- trunk/python-ogre/demos/ogre/tests/Test_SceneManagerOptions.py Modified: trunk/python-ogre/code_generators/bullet/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/bullet/generate_code.py 2007-10-07 00:40:05 UTC (rev 413) +++ trunk/python-ogre/code_generators/bullet/generate_code.py 2007-10-10 02:21:29 UTC (rev 414) @@ -5,7 +5,12 @@ # # ----------------------------------------------------------------------------- +## STARTER TEMPLATE.. +## replace bullet with lowercase project name +## set MAIN_NAMESPACE +## rename and configure .h files + import os, sys, time, shutil #add environment to the path @@ -18,7 +23,6 @@ import common_utils import customization_data import hand_made_wrappers -##import register_exceptions from pygccxml import parser from pygccxml import declarations @@ -33,16 +37,10 @@ import common_utils.extract_documentation as exdoc import common_utils.var_checker as varchecker import common_utils.ogre_properties as ogre_properties +from common_utils import docit -MAIN_NAMESPACE = 'bullet' +MAIN_NAMESPACE = '' -## small helper function -def docit ( general, i, o ): - docs = "Python-Ogre (Bullet) Modified Function Call\\n" + general +"\\n" - docs = docs + "Input: " + i + "\\n" - docs = docs + "Output: " + o + "\\n\\\n" - return docs - ############################################################ ## ## Here is where we manually exclude stuff @@ -51,7 +49,10 @@ def ManualExclude ( mb ): global_ns = mb.global_ns - + if MAIN_NAMESPACE: + main_ns = global_ns.namespace( MAIN_NAMESPACE ) + else: + main_ns = global_ns # remove functions that fail during compile excludes=['remove', 'findBinarySearch','findLinearSearch'] for c in global_ns.classes(): @@ -60,9 +61,6 @@ if m.name in excludes: m.exclude() excludes=['::btAlignedObjectArray<int>::expand' -# ,'::btAxisSweep3::createProxy' -# ,'::btBU_Simplex1to4::getName' -# ,'getName' ,'::btCollisionDispatcher::getNewManifold' ,'::btCollisionDispatcher::defaultNearCallback' ,'::btCollisionDispatcher::getInternalManifoldPointer' @@ -85,7 +83,6 @@ ,'::btBU_Simplex1to4::getName' ,'::btBoxShape::getName' ,'::btBvhTriangleMeshShape::getName' - ##,'::btConcaveShape::getName' ,'::btDispatcher::getInternalManifoldPointer' ,'::btAxisSweep3Internal<unsigned>::processAllOverlappingPairs' ,'::btAxisSweep3Internal<unsigned short>::processAllOverlappingPairs' @@ -102,16 +99,10 @@ excludes = ['btAlignedAllocator<btCollisionObject*, 16>' # ,'btAlignedAllocator<btCollisionShape*, 16>' + ,'btAlignedAllocator<int, 16>' ,'btAlignedAllocator<btPersistentManifold*, 16>' ,'btAlignedAllocator<btTypedConstraint*, 16>' ,'btAlignedAllocator<btRaycastVehicle*, 16>' - # these are being excluded becasue they keep including functions from their parent class - # instead of specifing 'bases' - ,'btCapsuleShape' ## fix later - ,'btConcaveShape' - ,'btConvexInternalShape' - ,'btConvexShape' - ,'btPolyhedralConvexShape' ] for e in excludes: print "excluding class", e @@ -128,6 +119,8 @@ o.exclude() global_ns.class_('btQuaternion').operators("operator-", arg_types=[]).exclude() + + ############################################################ ## ## And there are things that manually need to be INCLUDED @@ -136,18 +129,24 @@ def ManualInclude ( mb ): global_ns = mb.global_ns + if MAIN_NAMESPACE: + main_ns = global_ns.namespace( MAIN_NAMESPACE ) + else: + main_ns = global_ns global_ns.enumerations('PHY_ScalarType').include() - - + ############################################################ ## ## And things that need manual fixes, but not necessarly hand wrapped ## ############################################################ def ManualFixes ( mb ): - global_ns = mb.global_ns - + if MAIN_NAMESPACE: + main_ns = global_ns.namespace( MAIN_NAMESPACE ) + else: + main_ns = global_ns + ## issue where the defaults are &0.0 instead of 0.0 fixes=['btTransform', 'btRigidBody'] for e in fixes: @@ -155,8 +154,7 @@ for a in c.arguments: if a.default_value and "&0.0" in a.default_value: a.default_value = "::btVector3( (0.0), (0.0), (0.0) )" - - + ############################################################ ## ## And things that need to have their argument and call values fixed. @@ -168,105 +166,79 @@ def ManualTransformations ( mb ): global_ns = mb.global_ns - main_ns = global_ns# .namespace( MAIN_NAMESPACE ) - + if MAIN_NAMESPACE: + main_ns = global_ns.namespace( MAIN_NAMESPACE ) + else: + main_ns = global_ns + def create_output( size ): return [ ft.output( i ) for i in range( size ) ] - -############################################################################### -## -## Now for the AUTOMATIC stuff that should just work -## -############################################################################### - - -def AutoExclude( mb ): - """ Automaticaly exclude a range of things that don't convert well from C++ to Python - """ + +def AutoInclude( mb, dumy ): global_ns = mb.global_ns - main_ns = global_ns # No namespaces in bullet - - # vars that are static consts but have their values set in the header file are bad - Remove_Static_Consts ( main_ns ) - - ## Exclude protected and private that are not pure virtual - query = declarations.access_type_matcher_t( 'private' ) \ - & ~declarations.virtuality_type_matcher_t( declarations.VIRTUALITY_TYPES.PURE_VIRTUAL ) - try: - non_public_non_pure_virtual = main_ns.calldefs( query ) - non_public_non_pure_virtual.exclude() - except: - pass - - #Virtual functions that return reference could not be overriden from Python - query = declarations.virtuality_type_matcher_t( declarations.VIRTUALITY_TYPES.VIRTUAL ) \ - & declarations.custom_matcher_t( lambda decl: declarations.is_reference( decl.return_type ) ) - try: - main_ns.calldefs( query ).virtuality = declarations.VIRTUALITY_TYPES.NOT_VIRTUAL - except: - pass - -def AutoInclude( mb ): - global_ns = mb.global_ns global_ns.exclude() main_ns = global_ns ## Bullet doesn't have it's own namespace.. for cls in main_ns.classes(): -# print "checking", cls.name -# print cls.decl_string try: if cls.decl_string[2:4]=='bt' and cls.decl_string[4].isupper(): -# print "Including Class:", cls.name cls.include() except: pass ## and we'll need the free functions as well for funcs in main_ns.free_functions (): -# print "checking free", cls.name if funcs.name[0:2]=='bt' and funcs.name[2].isupper(): funcs.include() for var in main_ns.variables (): -# print "checking var ", var.name if len(var.name) > 2: if var.name[0:2]=='bt' and var.name[2].isupper(): var.include() for var in main_ns.typedefs (): -# print "checking typedef ", var.name if len(var.name) > 2: if var.name[0:2]=='bt' and var.name[2].isupper(): var.include() -# print "Member Func:", funcs.name -# if funcs.name[0]=='d': -# print "Including Member Function", funcs.name -# funcs.include() + + + +############################################################################### +## +## Now for the AUTOMATIC stuff that should just work +## +############################################################################### -def AutoFixes ( mb ): +def AutoFixes ( mb, MAIN_NAMESPACE ): """ now we fix a range of things automatically - typically by going through the entire name space trying to guess stuff and fix it:) - """ + """ global_ns = mb.global_ns - - main_ns = global_ns # .namespace( ns ) - - # arguments passed as refs but not const are not liked by boost -# Fix_Ref_Not_Const ( main_ns ) - + if MAIN_NAMESPACE: + main_ns = global_ns.namespace( MAIN_NAMESPACE ) + else: + main_ns = global_ns + # Functions that have void pointers in their argument list need to change to unsigned int's - Fix_Void_Ptr_Args ( main_ns ) - + pointee_types=[] + ignore_names=[] + common_utils.Fix_Void_Ptr_Args ( main_ns ) # , pointee_types, ignore_names ) + # and change functions that return a variety of pointers to instead return unsigned int's - Fix_Pointer_Returns ( main_ns ) + pointee_types=[] + ignore_names=[] # these are function names we know it's cool to exclude + common_utils.Fix_Pointer_Returns ( main_ns ) # , pointee_types, ignore_names ) # functions that need to have implicit conversions turned off - Fix_Implicit_Conversions ( main_ns) - + ImplicitClasses=[] + common_utils.Fix_Implicit_Conversions ( main_ns, ImplicitClasses ) + if os.name =='nt': Fix_NT( mb ) elif os.name =='posix': Fix_Posix( mb ) + common_utils.Auto_Document( mb, MAIN_NAMESPACE ) + ############################################################################### ## @@ -287,157 +259,13 @@ """ fixup for NT systems """ - -def Fix_Implicit_Conversions ( mb ): - """By default we disable explicit conversion, however sometimes it makes sense - """ - ImplicitClasses=[] - for className in ImplicitClasses: - mb.class_(className).constructors().allow_implicit_conversion = True - -def Add_Auto_Conversions( mb ): - pass - - -def Set_Call_Policies( mb ): - """ set the return call policies on classes that this hasn't already been done for. - Set the default policy to deal with pointer/reference return types to reference_existing object - """ - mem_funs = mb.calldefs () - mem_funs.create_with_signature = True #Generated code will not compile on - #MSVC 7.1 if function has throw modifier. - for mem_fun in mem_funs: - if mem_fun.call_policies: - continue - if not mem_fun.call_policies and \ - (declarations.is_reference (mem_fun.return_type) or declarations.is_pointer (mem_fun.return_type) ): - mem_fun.call_policies = call_policies.return_value_policy( - call_policies.reference_existing_object ) - -def Set_Exception(mb): - pass - #~ """We don't exclude Exception, because it contains functionality, that could - #~ be useful to user. But, we will provide automatic exception translator - #~ """ - #~ Exception = mb.namespace( 'Ogre' ).class_( 'Exception' ) - #~ Exception.include() - #~ Exception.mem_fun('what').exclude() # declared with empty throw - #~ Exception.mem_fun('getNumber').exclude() # declared with empty throw - #~ Exception.translate_exception_to_string( 'PyExc_RuntimeError', 'exc.getFullDescription().c_str()' ) - - -def _ReturnUnsignedInt( type_ ): - """helper to return an UnsignedInt call for tranformation functions - """ - return declarations.cpptypes.unsigned_int_t() - -def Fix_Void_Ptr_Args ( mb ): - """ we modify functions that take void *'s in their argument list to instead take - unsigned ints, which allows us to use CTypes buffers - """ - for fun in mb.member_functions(): - arg_position = 0 - for arg in fun.arguments: - if arg.type.decl_string == 'void const *' or arg.type.decl_string == 'void *': - fun.add_transformation( ft.modify_type(arg_position,_ReturnUnsignedInt ), alias=fun.name ) - fun.documentation = docit ("Modified Input Argument to work with CTypes", - "Argument "+arg.name+ "(pos:" + str(arg_position)\ - +") takes a CTypes.adddressof(xx)", "...") - #print "Fixed Void Ptr", fun, arg_position - break - arg_position +=1 - - ## lets go and look for stuff that might be a problem - pointee_types=['unsigned int',' int ', ' char', ' float ', ' Real ', 'uchar', 'uint8', - 'unsigned char'] - - function_names=[] - for fun in mb.member_functions(): - if fun.documentation or fun.ignore: continue ## means it's been tweaked somewhere else - for n in function_names: - if n in fun.name: - print "CHECK :", fun - break - arg_position = 0 - for arg in fun.arguments: - if declarations.is_pointer(arg.type): ## and "const" not in arg.type.decl_string: - for i in pointee_types: - if i in arg.type.decl_string: - print '"',arg.type.decl_string, '"' - print "CHECK ", fun, str(arg_position) - fun.documentation=docit("SUSPECT - MAYBE BROKEN", "....", "...") - break - arg_position +=1 - -## NEED To do the same for constructors - for fun in mb.constructors(): - arg_position = 0 - for arg in fun.arguments: - if declarations.is_pointer(arg.type): ## and "const" not in arg.type.decl_string: - for i in pointee_types: - if i in arg.type.decl_string: - print '"',arg.type.decl_string, '"' - print "Excluding: ", fun - fun.exclude() - break - arg_position +=1 - - - -def Fix_Pointer_Returns ( mb ): - """ Change out functions that return a variety of pointers to base types and instead - have them return the address the pointer is pointing to (the pointer value) - This allow us to use CTypes to handle in memory buffers from Python - - Also - if documentation has been set then ignore the class/function as it means it's been tweaked else where - """ - pointee_types=['unsigned int','int','float', 'char', 'unsigned char']# , 'char' ,'int'] - known_names=[] # these are function names we know it's cool to exclude - for fun in mb.member_functions(): - - if declarations.is_pointer (fun.return_type): ## and not fun.documentation: - for i in pointee_types: - if fun.return_type.decl_string.startswith ( i ) and not fun.documentation: - if not fun.name in known_names: - print "Excluding (function):", fun, "as it returns (pointer)", i - fun.exclude() - try: - for fun in mb.member_operators(): - if declarations.is_pointer (fun.return_type) and not fun.documentation: - for i in pointee_types: - if fun.return_type.decl_string.startswith ( i ) and not fun.documentation: - print "Excluding (operator):", fun - fun.exclude() - except: - pass - - - -def query_containers_with_ptrs(decl): - if not isinstance( decl, declarations.class_types ): - return False - if not decl.indexing_suite: - return False - return declarations.is_pointer( decl.indexing_suite.element_type ) - - -def Remove_Static_Consts ( mb ): - """ linux users have compile problems with vars that are static consts AND have values set in the .h files - we can simply leave these out """ - checker = varchecker.var_checker() - for var in mb.vars(): - if type(var.type) == declarations.cpptypes.const_t: - if checker( var ): - print "Excluding static const ", var - var.exclude() - # # the 'main'function # def generate_code(): messages.disable( -# # # Warnings 1020 - 1031 are all about why Py++ generates wrapper for class X +# Warnings 1020 - 1031 are all about why Py++ generates wrapper for class X messages.W1020 , messages.W1021 , messages.W1022 @@ -450,15 +278,15 @@ , messages.W1029 , messages.W1030 , messages.W1031 -# # , messages.W1035 -# # , messages.W1040 -# # , messages.W1038 -# , messages.W1041 + , messages.W1035 + , messages.W1040 + , messages.W1038 + , messages.W1041 , messages.W1036 # pointer to Python immutable member -# # , messages.W1033 # unnamed variables -# # , messages.W1018 # expose unnamed classes + , messages.W1033 # unnamed variables + , messages.W1018 # expose unnamed classes , messages.W1049 # returns reference to local variable -# , messages.W1014 # unsupported '=' operator + , messages.W1014 # unsupported '=' operator ) # # Use GCCXML to create the controlling XML file. @@ -469,7 +297,7 @@ os.path.join( environment.bullet.root_dir, "python_bullet.h" ) , environment.bullet.cache_file ) - defined_symbols = ['BULLET_EXPORTS'] # + defined_symbols = [ 'BULLET_EXPORTS' ] defined_symbols.append( 'VERSION_' + environment.bullet.version ) # @@ -483,34 +311,41 @@ , indexing_suite_version=2 , cflags=environment.bullet.cflags ) - # NOTE THE CHANGE HERE + + # if this module depends on another set it here + ## mb.register_module_dependency ( environment.ogre.generated_dir ) + + # normally implicit conversions work OK, however they can cause strange things to happen so safer to leave off mb.constructors().allow_implicit_conversion = False mb.BOOST_PYTHON_MAX_ARITY = 25 mb.classes().always_expose_using_scope = True - - + # # We filter (both include and exclude) specific classes and functions that we want to wrap # global_ns = mb.global_ns global_ns.exclude() - AutoInclude ( mb ) - - AutoExclude ( mb ) - ManualExclude ( mb ) + if MAIN_NAMESPACE == "" : + main_ns = global_ns + main_ns.include() + else: + main_ns = global_ns.namespace( MAIN_NAMESPACE ) + main_ns.exclude () + + AutoInclude ( mb, MAIN_NAMESPACE ) ## note we use our own version, not common_utils + common_utils.AutoExclude ( mb, MAIN_NAMESPACE ) ManualInclude ( mb ) # here we fixup functions that expect to modifiy their 'passed' variables ManualTransformations ( mb ) - - AutoFixes ( mb ) + AutoFixes ( mb, MAIN_NAMESPACE ) ManualFixes ( mb ) - + ManualExclude ( mb ) # # We need to tell boost how to handle calling (and returning from) certain functions # - Set_Call_Policies ( mb.global_ns ) + common_utils.Set_DefaultCall_Policies ( main_ns ) # # the manual stuff all done here !!! @@ -518,10 +353,9 @@ hand_made_wrappers.apply( mb ) NoPropClasses = [""] - main_ns = global_ns -# for cls in main_ns.classes(): -# if cls.name not in NoPropClasses: -# cls.add_properties( recognizer=ogre_properties.ogre_property_recognizer_t() ) + for cls in main_ns.classes(): + if cls.name not in NoPropClasses: + cls.add_properties( recognizer=ogre_properties.ogre_property_recognizer_t() ) common_utils.add_constants( mb, { 'bullet_version' : '"%s"' % environment.bullet.version.replace("\n", "\\\n") , 'python_version' : '"%s"' % sys.version.replace("\n", "\\\n" ) } ) @@ -535,7 +369,7 @@ # Creating the code. After this step you should not modify/customize declarations. # ########################################################################################## - extractor = exdoc.doc_extractor("") # I'm excluding the UTFstring docs as lots about nothing + extractor = exdoc.doc_extractor() # I'm excluding the UTFstring docs as lots about nothing mb.build_code_creator (module_name='_bullet_' , doc_extractor= extractor ) for inc in environment.bullet.include_dirs: @@ -547,7 +381,18 @@ mb.split_module(environment.bullet.generated_dir, huge_classes, use_files_sum_repository=False) - + ## now we need to ensure a series of headers and additional source files are + ## copied to the generated directory.. + additional_dirs=[] + for d in additional_dirs: + for f in os.listdir(d): + if f.endswith('cpp') or f.endswith('.h'): + sourcefile = os.path.join(d, f) + destfile = os.path.join(environment.bullet.generated_dir, f ) + if not common_utils.samefile( sourcefile ,destfile ): + shutil.copy( sourcefile, environment.bullet.generated_dir ) + print "Updated ", f, "as it was missing or out of date" + if __name__ == '__main__': start_time = time.clock() generate_code() Modified: trunk/python-ogre/code_generators/bullet/hand_made_wrappers.py =================================================================== --- trunk/python-ogre/code_generators/bullet/hand_made_wrappers.py 2007-10-07 00:40:05 UTC (rev 413) +++ trunk/python-ogre/code_generators/bullet/hand_made_wrappers.py 2007-10-10 02:21:29 UTC (rev 414) @@ -16,6 +16,105 @@ } """ +WRAPPER_DEFINITION_btPersistentManifold=\ +""" +btCollisionObject* getBodyAsObject0 ( btPersistentManifold & me ){ + return static_cast<btCollisionObject*>(me.getBody0()); + } +btCollisionObject* getBodyAsObject1 ( btPersistentManifold & me ){ + return static_cast<btCollisionObject*>(me.getBody1()); + } +bp::list getBodies ( btPersistentManifold & me ) { + bp::list listout; + listout.append( static_cast<btCollisionObject*>(me.getBody0()) ); + listout.append( static_cast<btCollisionObject*>(me.getBody1()) ); + return listout; + } +""" + +WRAPPER_REGISTRATION_btPersistentManifold = [ + """def( "getBodyAsObject0", &::getBodyAsObject0, + "Python-Ogre Helper Function: Get the first body (0) in a collision\\n\\ + Input: None\\n\\ + Output: btCollisionObject\\n", + bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >() );""", + """def( "getBodyAsObject1", &::getBodyAsObject1, + "Python-Ogre Helper Function: Get the second body (1) in a collision\\n\\ + Input: None\\n\\ + Output: btCollisionObject\\n", + bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >() );""", + """def( "getBodies", &::getBodies, + "Python-Ogre Helper Function: Get a list containing both bodies in a collision\\n\\ + Input: None\\n\\ + Output: list of 2 btCollisionObject objects\\n" );""" + ] + +WRAPPER_DEFINITION_btCollisionWorld=\ +""" +bp::list getCollidingObjects ( btCollisionWorld & me ) { + bp::list listout; + // do the collisiondetection + me.performDiscreteCollisionDetection(); + + const unsigned int numManifolds = me.getDispatcher()->getNumManifolds(); + for (unsigned int i=0;i < numManifolds; i++) + { + btPersistentManifold* contactManifold = me.getDispatcher()->getManifoldByIndexInternal(i); + + btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0()); + btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1()); + + contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform()); + + const unsigned int numContacts = contactManifold->getNumContacts(); + if (numContacts > 0) { + listout.append(bp::make_tuple(obA, obB, numContacts) ); + } + } + return listout; +} + +bp::list getCollidingObjectsAndPoints ( btCollisionWorld & me ) { + bp::list listout; + bp::list * sublist; + + // do the collisiondetection + me.performDiscreteCollisionDetection(); + + const unsigned int numManifolds = me.getDispatcher()->getNumManifolds(); + for (unsigned int i=0;i < numManifolds; i++) { + btPersistentManifold* contactManifold = me.getDispatcher()->getManifoldByIndexInternal(i); + + btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0()); + btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1()); + + contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform()); + + const unsigned int numContacts = contactManifold->getNumContacts(); + if (numContacts > 0) { + sublist = new bp::list(); + for (unsigned int j = 0;j < numContacts; j++) { + btManifoldPoint& pt = contactManifold->getContactPoint(j); + sublist->append ( pt ); + } + listout.append(bp::make_tuple(obA, obB, sublist) ); + } + } + return listout; +} +""" +WRAPPER_REGISTRATION_btCollisionWorld = [ + """def( "getCollidingObjects", &::getCollidingObjects, + "Python-Ogre Helper Function: Get a list of all colliding bodies in the world\\n\\ + Input: None\\n\\ + Output: lists of tuples, each tuple contains body0, body1 and num contact points\\n" );""", + """def( "getCollidingObjectsAndPoints", &::getCollidingObjectsAndPoints, + "Python-Ogre Helper Function: Get a list of all colliding bodies along with contact points\\n\\ + Input: None\\n\\ + Output: list of tuples, each tuples contains body0, body1 and a list of contact points\\n" );""", + ] + + ################################################################################################# ################################################################################################# @@ -27,8 +126,15 @@ rt = mb.class_( 'btCollisionShape' ) rt.add_wrapper_code ( WRAPPER_WRAPPER_getName ) - rt = mb.class_( 'btConcaveShape' ) - rt.add_wrapper_code ( WRAPPER_WRAPPER_getName ) + rt = mb.class_( 'btDispatcher' ) rt.add_wrapper_code ( WRAPPER_WRAPPER_getInternalManifoldPointer ) -# \ No newline at end of file + + rt = mb.class_( 'btCollisionWorld' ) + rt.add_declaration_code( WRAPPER_DEFINITION_btCollisionWorld ) + apply_reg (rt, WRAPPER_REGISTRATION_btCollisionWorld ) + + rt = mb.class_( 'btPersistentManifold' ) + rt.add_declaration_code( WRAPPER_DEFINITION_btPersistentManifold ) + apply_reg (rt, WRAPPER_REGISTRATION_btPersistentManifold ) + \ No newline at end of file Modified: trunk/python-ogre/code_generators/ogre/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/ogre/generate_code.py 2007-10-07 00:40:05 UTC (rev 413) +++ trunk/python-ogre/code_generators/ogre/generate_code.py 2007-10-10 02:21:29 UTC (rev 414) @@ -175,7 +175,9 @@ ## these are hand wrapper -- # global_ns.class_('::Ogre::RenderQueueListener').mem_fun('renderQueueStarted').exclude() # global_ns.class_('::Ogre::RenderQueueListener').mem_fun('renderQueueEnded').exclude() - + global_ns.class_('::Ogre::SceneManager').mem_fun('setOption').exclude() + global_ns.class_('::Ogre::SceneManager').mem_fun('getOption').exclude() + ## as we now include all protected functions tere are a couple of problem areas that popped up main_ns.constructor("IndexData",arg_types=['::Ogre::IndexData const &']).exclude() global_ns.class_('::Ogre::OverlayManager').\ @@ -935,7 +937,14 @@ ManualAlias ( mb ) AutoFixes ( mb, MAIN_NAMESPACE ) ManualFixes ( mb ) - + for cls in main_ns.classes(): + if not cls.ignore: + try: + for c in cls.constructors(): + if c.access_type != 'public': + print "NPC:", c.access_type, c + except: + print "Class without constructors", cls #Py++ can not expose static pointer member variables main_ns.vars( 'ms_Singleton' ).disable_warnings( messages.W1035 ) Modified: trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py =================================================================== --- trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py 2007-10-07 00:40:05 UTC (rev 413) +++ trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py 2007-10-10 02:21:29 UTC (rev 414) @@ -620,7 +620,115 @@ """def( "createVertexData", &::SubMesh_createandsetVertexData );""" ] + +################################################################################################# +WRAPPER_DEFINITION_SceneManager =\ +""" +bool SceneManager_setOption( Ogre::SceneManager & me, const Ogre::String& strKey, bp::object pValue ) { + bp::extract<Ogre::AxisAlignedBox> p( pValue ); + if( p.check() ){ + Ogre::AxisAlignedBox var = p(); + return me.setOption ( strKey, reinterpret_cast< void * >( &var ) ); + } + bp::extract<Ogre::Vector3> p3( pValue ); + if( p3.check() ){ + Ogre::Vector3 var = p3(); + return me.setOption ( strKey, reinterpret_cast< void * >( &var ) ); + } + bp::extract<Ogre::Matrix3> p4( pValue ); + if( p4.check() ){ + Ogre::Matrix3 var = p4(); + return me.setOption ( strKey, reinterpret_cast< void * >( &var ) ); + } + bp::extract<Ogre::Matrix4> p5( pValue ); + if( p5.check() ){ + Ogre::Matrix4 var = p5(); + return me.setOption ( strKey, reinterpret_cast< void * >( &var ) ); + } + bp::extract<Ogre::Quaternion> p6( pValue ); + if( p6.check() ){ + Ogre::Quaternion var = p6(); + return me.setOption ( strKey, reinterpret_cast< void * >( &var ) ); + } + bp::extract<int> p2( pValue ); + if( p2.check() ){ + int var = p2(); + return me.setOption ( strKey, reinterpret_cast< void * >( &var ) ); + } + bp::extract<bool> p1( pValue ); + if( p1.check() ){ + bool var = p1(); + return me.setOption ( strKey, reinterpret_cast< void * >( &var ) ); + } + return false; +} + + +bp::tuple SceneManager_getOption( Ogre::SceneManager & me, const Ogre::String& strKey, bp::object returnType) { + + bp::extract<Ogre::AxisAlignedBox> p( returnType ); + if( p.check() ){ + Ogre::AxisAlignedBox var = p(); + bool ret = me.getOption ( strKey, reinterpret_cast< void * >( &var ) ); + return bp::make_tuple ( ret, var ); + } + bp::extract<Ogre::Vector3> p3( returnType ); + if( p3.check() ){ + Ogre::Vector3 var = p3(); + bool ret = me.getOption ( strKey, reinterpret_cast< void * >( &var ) ); + return bp::make_tuple ( ret, var ); + } + bp::extract<Ogre::Matrix3> p4( returnType ); + if( p4.check() ){ + Ogre::Matrix3 var = p4(); + bool ret = me.getOption ( strKey, reinterpret_cast< void * >( &var ) ); + return bp::make_tuple ( ret, var ); + } + bp::extract<Ogre::Matrix4> p5( returnType ); + if( p5.check() ){ + Ogre::Matrix4 var = p5(); + bool ret = me.getOption ( strKey, reinterpret_cast< void * >( &var ) ); + return bp::make_tuple ( ret, var ); + } + bp::extract<Ogre::Quaternion> p6( returnType ); + if( p6.check() ){ + Ogre::Quaternion var = p6(); + bool ret = me.getOption ( strKey, reinterpret_cast< void * >( &var ) ); + return bp::make_tuple ( ret, var ); + } + bp::extract<int> p2( returnType ); + if( p2.check() ){ + int var = p2(); + bool ret = me.getOption ( strKey, reinterpret_cast< void * >( &var ) ); + return bp::make_tuple ( ret, var ); + } + bp::extract<bool> p1( returnType ); + if( p1.check() ){ + bool var = p1(); + bool ret = me.getOption ( strKey, reinterpret_cast< void * >( &var ) ); + return bp::make_tuple ( ret, var ); + } + return bp::make_tuple ( false, false ); +} + +""" + +WRAPPER_REGISTRATION_SceneManager = [ + """def( "setOption", &::SceneManager_setOption , + "Python-Ogre Helper Function: sets an option in the SceneManager\\n\\ + Input: Option Name, Option Value\\n\\ + Ouput: True/False" );""", + """def( "getOption", &::SceneManager_getOption , + "Python-Ogre Helper Function: returns an option from the SceneManager\\n\\ + Input: Option Name\\n\\ + Ouput: Tuple containing bool (True/False -- success of call) and value" );""" + ] + + + +################################################################################################# + def iter_as_generator_vector( cls ): print "ITER:", cls @@ -695,6 +803,11 @@ rt.add_declaration_code( WRAPPER_DEFINITION_SubMesh ) apply_reg (rt, WRAPPER_REGISTRATION_SubMesh ) + rt = mb.class_( 'SceneManager' ) + rt.add_declaration_code( WRAPPER_DEFINITION_SceneManager ) + apply_reg (rt, WRAPPER_REGISTRATION_SceneManager ) + + mb.add_declaration_code( WRAPPER_DEFINITION_General ) apply_reg (mb, WRAPPER_REGISTRATION_General ) Modified: trunk/python-ogre/code_generators/ogrebulletc/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/ogrebulletc/generate_code.py 2007-10-07 00:40:05 UTC (rev 413) +++ trunk/python-ogre/code_generators/ogrebulletc/generate_code.py 2007-10-10 02:21:29 UTC (rev 414) @@ -67,6 +67,11 @@ else: main_ns = global_ns + global_ns.namespace( 'Ogre' ).class_('MovableObject').include(already_exposed=True) + global_ns.namespace( 'Ogre' ).class_('UserDefinedObject').include(already_exposed=True) + global_ns.namespace( 'Ogre' ).class_('SimpleRenderable').include(already_exposed=True) + + ############################################################ ## ## And things that need manual fixes, but not necessarly hand wrapped Added: trunk/python-ogre/demos/ogre/tests/Test_SceneManagerOptions.py =================================================================== --- trunk/python-ogre/demos/ogre/tests/Test_SceneManagerOptions.py (rev 0) +++ trunk/python-ogre/demos/ogre/tests/Test_SceneManagerOptions.py 2007-10-10 02:21:29 UTC (rev 414) @@ -0,0 +1,50 @@ +import ogre.renderer.OGRE as ogre +import SampleFramework as sf +import ctypes + + +class EnvMapApplication(sf.Application): + def _createScene( self ): + sceneManager = self.sceneManager + camera = self.camera + + sceneManager.ambientLight = ogre.ColourValue (0.5, 0.5, 0.5) + + light = sceneManager.createLight('MainLight') + light.setPosition (20, 80, 50) + + entity = sceneManager.createEntity('head', 'ogrehead.mesh') + entity.setMaterialName("Examples/EnvMappedRustySteel") + sceneManager.getRootSceneNode().createChildSceneNode().attachObject(entity) + print "\n\nCHECKING OPTIONS" + svO = ogre.StringVector() + options = sceneManager.getOptionKeys(svO) + for o in svO: + print "Option: ", o + svV = ogre.StringVector() + values = sceneManager.getOptionValues(o, svV) + for v in svV: + print "Possible Value: ", v + + ## octscenemanager (default) has the following options + ## Size -- AxisAligneBox + ## Depth -- Int + ## ShowOctree -- bool + ret,size = sceneManager.getOption ( 'Size', ogre.AxisAlignedBox() ) + print "Size: ", size + ret,depth = sceneManager.getOption ( 'Depth', int(1) ) + print "Depth: ", depth + ret,value = sceneManager.getOption ( 'ShowOctree', bool(0) ) + print "ShowOctree: ", value + + sceneManager.setOption( 'ShowOctree', True) + sceneManager.setOption( 'Depth',depth) + print dir(size) + + size.setMaximum((100,100,100)) + size.setMinimum((0,0,0)) + sceneManager.setOption( 'Size', size) +if __name__ == '__main__': + + application = EnvMapApplication() + application.go() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-07 00:40:02
|
Revision: 413 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=413&view=rev Author: andy_miller Date: 2007-10-06 17:40:05 -0700 (Sat, 06 Oct 2007) Log Message: ----------- Renamed Linux install scripts to match order.. Modified Paths: -------------- trunk/python-ogre/scripts/master.sh Added Paths: ----------- trunk/python-ogre/scripts/03-BuildTools.sh trunk/python-ogre/scripts/04-BuildBaseLibs.sh trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh Removed Paths: ------------- trunk/python-ogre/scripts/03-BuildBaseLibs.sh trunk/python-ogre/scripts/04-BuildAdditionalLibs.sh trunk/python-ogre/scripts/05-BuildTools.sh Deleted: trunk/python-ogre/scripts/03-BuildBaseLibs.sh =================================================================== --- trunk/python-ogre/scripts/03-BuildBaseLibs.sh 2007-10-06 11:17:27 UTC (rev 412) +++ trunk/python-ogre/scripts/03-BuildBaseLibs.sh 2007-10-07 00:40:05 UTC (rev 413) @@ -1,79 +0,0 @@ -#!/bin/bash -# Part of the Python-Ogre installation - -# master config setup -source ./config.sh - -echo " == Building base libraries == " -# -# zlib as the one included in Ubuntu is buggy -# -echo " -- building zzlib --" -pushd zziplib-0.13.49 -aclocal -./configure --prefix=$PREFIX --datadir=$PREFIX/share -make -make install -popd -# -# Install CEGUI (Crazy Eddie's GUI) -# -echo " -- Building CEGUI" -pushd CEGUI-0.5.0 -aclocal -#patch -q -i ../python-ogre/patch/cegui.patch -p0 -#echo "EMPTY" >>./INSTALL -#echo "EMPTY" >>./NEWS -automake -./configure --prefix=$PREFIX --enable-freeimage=yes --disable-samples --without-ogre-renderer -make -make install -popd - -# -# Install OIS (Object Oriented Input System) -# -echo " -- Builing OIS" -pushd ois-1.0RC1 -./bootstrap -./configure --prefix=$PREFIX -make -make install -popd - - -# -# Install and build ODE -# -echo " -- Building ODE" -pushd ode-0.8 -chmod +x autogen.sh -./autogen.sh -./configure --prefix=$PREFIX -make -make install -popd - -# -# Install Ogre (Object Oriented Graphics Rendering Engine) -# -echo " -- Building Ogre" -pushd ogrenew -aclocal -./bootstrap -./configure --prefix=$PREFIX -make -make install -cd ReferenceApplication -aclocal -./bootstrap -./configure --prefix=$PREFIX -make -make install -cd .. -popd - -echo -echo " ==== Finished building base libraries ====" - - Added: trunk/python-ogre/scripts/03-BuildTools.sh =================================================================== --- trunk/python-ogre/scripts/03-BuildTools.sh (rev 0) +++ trunk/python-ogre/scripts/03-BuildTools.sh 2007-10-07 00:40:05 UTC (rev 413) @@ -0,0 +1,70 @@ +#!/bin/bash +# Part of the Python-Ogre installation + +# master config setup +source ./config.sh + +echo " === Building Tools ===" + +# +# build GCC_XML +# +echo " -- building GCC_XML" +mkdir -p gccxml-build +cd gccxml-build +cmake ../gccxml -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX +make +make install +cd .. + + +# +# build and install boost +# +echo " -- building boost" +cd boost_1_34_0 +./configure --with-libraries=python --prefix=$PREFIX +cat << EOF > boost.patch +--- Makefile 2007-05-12 12:10:17.000000000 -0300 ++++ Makefile.new 2007-05-12 12:10:52.000000000 -0300 +@@ -1,6 +1,4 @@ +-BJAM=./tools/jam/src/bin.linuxx86 +-don't know how to make trie.c +-...skipped bjam for lack of trie.c.../bjam ++BJAM=bjam +BJAM_CONFIG=release +PREFIX=/usr/local +EPREFIX=/usr/local +EOF +patch -N -p0 < boost.patch +sed -i s/'BOOST_PYTHON_MAX_ARITY 15'/'BOOST_PYTHON_MAX_ARITY 19'/ boost/python/detail/preprocessor.hpp +make +make install +cd $INSTALL_DIR + +## Scons +echo " -- installing SCONs" +rm -rf scons-0.96.96 +tar -xvzf $DOWNLOADS/scons-0.96.96.tar.gz --overwrite +cd scons-0.96.96 +python setup.py install --prefix=$PREFIX +cd .. + +echo " -- installing SCONs" +rm -rf scons-0.97.0d20070918 +tar -xvzf $DOWNLOADS/scons-0.97.0d20070918.tar.gz --overwrite +cd scons-0.97.0d20070918 +####python setup.py install --prefix=$PREFIX +cd .. + + +# py++ +echo " -- installing PY++" +cd pygccxml/pygccxml_dev +python setup.py install --prefix=$PREFIX +cd ../pyplusplus_dev +python setup.py install --prefix=$PREFIX +cd $INSTALL_DIR + +echo +echo " ==== Done building tools ====" Deleted: trunk/python-ogre/scripts/04-BuildAdditionalLibs.sh =================================================================== --- trunk/python-ogre/scripts/04-BuildAdditionalLibs.sh 2007-10-06 11:17:27 UTC (rev 412) +++ trunk/python-ogre/scripts/04-BuildAdditionalLibs.sh 2007-10-07 00:40:05 UTC (rev 413) @@ -1,67 +0,0 @@ -#!/bin/bash -# Part of the Python-Ogre installation - -# master config setup -source ./config.sh - -echo " == Building additional libraries == " -# -# Install and build OgreOde -# -echo " -- Building Ogreode" -pushd ogreaddons/ogreode -chmod +x autogen.sh -./autogen.sh -./configure --prefix=$PREFIX -make -make install -popd - -# -# Install and build OgreNewt -# -echo " -- Building OgreNewt" -pushd ogreaddons/ogrenewt -scons prefix=$PREFIX boost=$PREFIX/include/boost-1_34 install -popd - -# -# OgreAl -# -echo " -- Building OgreAL - libogg" -pushd libogg-1.1.3 -./configure --prefix=$PREFIX -make -make install -popd - -echo " -- Building OgreAL - libvorbis" -pushd libvorbis-1.2.0 -./configure --prefix=$PREFIX -make -make install -popd - -echo " -- Building OgreAL - openal" -pushd openal-0.0.8 -./autogen.sh -./configure --prefix=$PREFIX -make -make install -popd - -echo " -- Building OgreAL - freealut" -pushd freealut-1.1.0 -./autogen.sh -./configure --prefix=$PREFIX -## ugly hack as the make files in freealut don't really handle a non standard prefix -cp $PREFIX/include/AL/* ./include/AL -make -make install -popd - -# -# Bullet -# -##pushd bullet-2.62a - Added: trunk/python-ogre/scripts/04-BuildBaseLibs.sh =================================================================== --- trunk/python-ogre/scripts/04-BuildBaseLibs.sh (rev 0) +++ trunk/python-ogre/scripts/04-BuildBaseLibs.sh 2007-10-07 00:40:05 UTC (rev 413) @@ -0,0 +1,79 @@ +#!/bin/bash +# Part of the Python-Ogre installation + +# master config setup +source ./config.sh + +echo " == Building base libraries == " +# +# zlib as the one included in Ubuntu is buggy +# +echo " -- building zzlib --" +pushd zziplib-0.13.49 +aclocal +./configure --prefix=$PREFIX --datadir=$PREFIX/share +make +make install +popd +# +# Install CEGUI (Crazy Eddie's GUI) +# +echo " -- Building CEGUI" +pushd CEGUI-0.5.0 +aclocal +#patch -q -i ../python-ogre/patch/cegui.patch -p0 +#echo "EMPTY" >>./INSTALL +#echo "EMPTY" >>./NEWS +automake +./configure --prefix=$PREFIX --enable-freeimage=yes --disable-samples --without-ogre-renderer +make +make install +popd + +# +# Install OIS (Object Oriented Input System) +# +echo " -- Builing OIS" +pushd ois-1.0RC1 +./bootstrap +./configure --prefix=$PREFIX +make +make install +popd + + +# +# Install and build ODE +# +echo " -- Building ODE" +pushd ode-0.8 +chmod +x autogen.sh +./autogen.sh +./configure --prefix=$PREFIX +make +make install +popd + +# +# Install Ogre (Object Oriented Graphics Rendering Engine) +# +echo " -- Building Ogre" +pushd ogrenew +aclocal +./bootstrap +./configure --prefix=$PREFIX +make +make install +cd ReferenceApplication +aclocal +./bootstrap +./configure --prefix=$PREFIX +make +make install +cd .. +popd + +echo +echo " ==== Finished building base libraries ====" + + Added: trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh =================================================================== --- trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh (rev 0) +++ trunk/python-ogre/scripts/05-BuildAdditionalLibs.sh 2007-10-07 00:40:05 UTC (rev 413) @@ -0,0 +1,67 @@ +#!/bin/bash +# Part of the Python-Ogre installation + +# master config setup +source ./config.sh + +echo " == Building additional libraries == " +# +# Install and build OgreOde +# +echo " -- Building Ogreode" +pushd ogreaddons/ogreode +chmod +x autogen.sh +./autogen.sh +./configure --prefix=$PREFIX +make +make install +popd + +# +# Install and build OgreNewt +# +echo " -- Building OgreNewt" +pushd ogreaddons/ogrenewt +scons prefix=$PREFIX boost=$PREFIX/include/boost-1_34 install +popd + +# +# OgreAl +# +echo " -- Building OgreAL - libogg" +pushd libogg-1.1.3 +./configure --prefix=$PREFIX +make +make install +popd + +echo " -- Building OgreAL - libvorbis" +pushd libvorbis-1.2.0 +./configure --prefix=$PREFIX +make +make install +popd + +echo " -- Building OgreAL - openal" +pushd openal-0.0.8 +./autogen.sh +./configure --prefix=$PREFIX +make +make install +popd + +echo " -- Building OgreAL - freealut" +pushd freealut-1.1.0 +./autogen.sh +./configure --prefix=$PREFIX +## ugly hack as the make files in freealut don't really handle a non standard prefix +cp $PREFIX/include/AL/* ./include/AL +make +make install +popd + +# +# Bullet +# +##pushd bullet-2.62a + Deleted: trunk/python-ogre/scripts/05-BuildTools.sh =================================================================== --- trunk/python-ogre/scripts/05-BuildTools.sh 2007-10-06 11:17:27 UTC (rev 412) +++ trunk/python-ogre/scripts/05-BuildTools.sh 2007-10-07 00:40:05 UTC (rev 413) @@ -1,70 +0,0 @@ -#!/bin/bash -# Part of the Python-Ogre installation - -# master config setup -source ./config.sh - -echo " === Building Tools ===" - -# -# build GCC_XML -# -echo " -- building GCC_XML" -mkdir -p gccxml-build -cd gccxml-build -cmake ../gccxml -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX -make -make install -cd .. - - -# -# build and install boost -# -echo " -- building boost" -cd boost_1_34_0 -./configure --with-libraries=python --prefix=$PREFIX -cat << EOF > boost.patch ---- Makefile 2007-05-12 12:10:17.000000000 -0300 -+++ Makefile.new 2007-05-12 12:10:52.000000000 -0300 -@@ -1,6 +1,4 @@ --BJAM=./tools/jam/src/bin.linuxx86 --don't know how to make trie.c --...skipped bjam for lack of trie.c.../bjam -+BJAM=bjam -BJAM_CONFIG=release -PREFIX=/usr/local -EPREFIX=/usr/local -EOF -patch -N -p0 < boost.patch -sed -i s/'BOOST_PYTHON_MAX_ARITY 15'/'BOOST_PYTHON_MAX_ARITY 19'/ boost/python/detail/preprocessor.hpp -make -make install -cd $INSTALL_DIR - -## Scons -echo " -- installing SCONs" -rm -rf scons-0.96.96 -tar -xvzf $DOWNLOADS/scons-0.96.96.tar.gz --overwrite -cd scons-0.96.96 -python setup.py install --prefix=$PREFIX -cd .. - -echo " -- installing SCONs" -rm -rf scons-0.97.0d20070918 -tar -xvzf $DOWNLOADS/scons-0.97.0d20070918.tar.gz --overwrite -cd scons-0.97.0d20070918 -####python setup.py install --prefix=$PREFIX -cd .. - - -# py++ -echo " -- installing PY++" -cd pygccxml/pygccxml_dev -python setup.py install --prefix=$PREFIX -cd ../pyplusplus_dev -python setup.py install --prefix=$PREFIX -cd $INSTALL_DIR - -echo -echo " ==== Done building tools ====" Modified: trunk/python-ogre/scripts/master.sh =================================================================== --- trunk/python-ogre/scripts/master.sh 2007-10-06 11:17:27 UTC (rev 412) +++ trunk/python-ogre/scripts/master.sh 2007-10-07 00:40:05 UTC (rev 413) @@ -1,14 +1,16 @@ #!/bin/bash # Part of the Python-Ogre installation -# Run them all :) +# Run them all -- or at least the ones you need + +# Notes that 00-PreReqs is probably Ubuntu dependent.. source ./00-PreReqs.sh source ./01-RetrieveSource.sh source ./02-ExtractAndPatch.sh -source ./05-BuildTools.sh -source ./03-BuildBaseLibs.sh -source ./04-BuildAdditionalLibs.sh -#source ./06-GenerateCode.sh -#source ./07-BuildModules.sh +source ./03-BuildTools.sh +source ./04-BuildBaseLibs.sh +source ./05-BuildAdditionalLibs.sh +source ./06-GenerateCode.sh +source ./07-BuildModules.sh This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-06 11:17:27
|
Revision: 412 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=412&view=rev Author: andy_miller Date: 2007-10-06 04:17:27 -0700 (Sat, 06 Oct 2007) Log Message: ----------- Linux Updates Modified Paths: -------------- trunk/python-ogre/SConstruct trunk/python-ogre/code_generators/common_utils/extract_documentation.py trunk/python-ogre/demos/caelum/Demo_Caelum01.py trunk/python-ogre/demos/caelum/plugins.cfg trunk/python-ogre/demos/et/plugins.cfg trunk/python-ogre/demos/ogre/plugins.cfg trunk/python-ogre/demos/qgui/plugins.cfg trunk/python-ogre/environment.py trunk/python-ogre/scripts/00-PreReqs.sh trunk/python-ogre/scripts/01-RetrieveSource.sh trunk/python-ogre/scripts/02-ExtractAndPatch.sh trunk/python-ogre/scripts/03-BuildBaseLibs.sh trunk/python-ogre/scripts/05-BuildTools.sh trunk/python-ogre/scripts/06-GenerateCode.sh trunk/python-ogre/scripts/07-BuildModules.sh trunk/python-ogre/scripts/config.sh trunk/python-ogre/scripts/master.sh Modified: trunk/python-ogre/SConstruct =================================================================== --- trunk/python-ogre/SConstruct 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/SConstruct 2007-10-06 11:17:27 UTC (rev 412) @@ -47,7 +47,7 @@ Return ('_%(name)s')\n """ % { 'name':cls._name, 'targettype':targettype } ) -def get_ccflags(): +def get_ccflags(cls): if os.name=='nt': CCFLAGS='' #CCFLAGS += '-DBOOST_PYTHON_MAX_ARITY=19' @@ -58,10 +58,14 @@ CCFLAGS += ' /Ox /Ob2 /Oi /Ot /Oy /GS- /GR ' elif os.name =='posix': if os.sys.platform <> 'darwin': - CCFLAGS = ' `pkg-config --cflags OGRE` ' + CCFLAGS = ' `pkg-config --cflags OGRE` ' ## needs to change I think :) CCFLAGS += ' -I' - CCFLAGS += ' -O3 -I./ -fvisibility=hidden -finline-limit=20 ' - CCFLAGS += ' -DOGRE_GCC_VISIBILITY ' # -fvisibility-inlines-hidden + CCFLAGS += ' -O3 -I./ ' + if cls.ModuleName == 'OGRE': + ##### -fvisibility=hidden -finline-limit=20 ' + #CCFLAGS += ' -fvisibility=hidden -fvisibility-inlines-hidden -DOGRE_GCC_VISIBILITY ' + CCFLAGS += ' ' + else: CCFLAGS = ' -I -pipe -Os -I./' return CCFLAGS @@ -134,7 +138,7 @@ ## setup compile paths and flags (standard and additional) _env.Append ( CPPPATH = cls.include_dirs + [environment.python_include_dirs, environment.Config.PATH_Boost] ) - ccflags= get_ccflags() + ccflags= get_ccflags(cls) if hasattr( cls, 'CCFLAGS'): ccflags += cls.CCFLAGS _env.Append ( CCFLAGS=ccflags ) @@ -157,14 +161,14 @@ ## ugly hack - scons returns a list of targets from SharedLibrary - we have to choose the one we want index = 0 # this is the index into a list of targets - '0' should be the platform default - if os.name=="nt" + if os.name=="nt": ## and lets have it install the output into the 'package_dir_name/ModuleName' dir and rename to the PydName _env.AddPostAction(package,\ 'mt.exe -nologo -manifest %(name)s.manifest -outputresource:%(name)s;2' % { 'name':package[index] } ) - else: + else: _env.AddPostAction(package,\ - '-strip --debug %(name)s' % { 'name':package[index] } ) - + '-strip -g -S -d --strip-debug -s %(name)s' % { 'name':package[index] } ) + _env.InstallAs(os.path.join(environment.package_dir_name, cls.parent, cls.ModuleName, cls.PydName), package[index] ) Modified: trunk/python-ogre/code_generators/common_utils/extract_documentation.py =================================================================== --- trunk/python-ogre/code_generators/common_utils/extract_documentation.py 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/code_generators/common_utils/extract_documentation.py 2007-10-06 11:17:27 UTC (rev 412) @@ -97,7 +97,7 @@ ret ="" if doc_lines: doc_lines = remove_leading_blanks ( doc_lines ) - #print "Extracted Doc String for:", declaration, "[", len(doc_lines),"]" +# print "Extracted Doc String for:", declaration, "[", len(doc_lines),"]" ## we need to cope with strings longer than 2048 for MSVC ret = "\\\n".join(doc_lines) if len ( ret ) > 1700: ## just to be safe and adjust for line end chars etc.. @@ -120,10 +120,10 @@ c = ' ' newret = newret + c if len(basedoc) >1 or len(newret)>1: -# # self.outfile.write("***============================*****\n" + declaration.decl_string + "\n") -# # self.outfile.write( str(len(basedoc)) + " " + str(len(newret)) + "\n" ) -# # self.outfile.write( newret ) - return '"' + basedoc + newret.lstrip() + '"' +# print("***============================*****\n" + declaration.decl_string + "\n") +# print ( str(len(basedoc)) + " " + str(len(newret)) + "\n" ) +# print ( newret ) + return '"' + basedoc + newret.lstrip() + '"' else: return "" def remove_leading_blanks ( docin ): @@ -204,7 +204,8 @@ # _str = clean(_str, "@par", "") ## it will get a single blank line by default -- breaks @param... _str = clean(_str, "\\par", "") ## it will get a single blank line by default - _str = clean(_str, "\n", "\\n") + _str = clean(_str, "\r\n", "\\n") + _str = clean(_str, "\n", "\\n") _str = clean(_str, "\\p", "") ## cegui comments _str = clean(_str, "\\li", " * ") ## ode comments _str = clean(_str, "\\exception", "@exception") @@ -217,7 +218,10 @@ ## now clean up the rest _str = reduce(clean, [_str, '/', '*', '!', "\\brief", '\\fn', - "@brief", "@fn", '"', "@{", "\\c", "\\a"]) ## somtimes there are '"' in the doc strings and other "\\"... + "@brief", "@fn", '"', "@{", "\\c", "\\a"]) ## somtimes there are '"' in the doc strings and other "\\"... + + + # return _str.lstrip() # return " " + _str.lstrip() return _str ## no removale of white space so Epytext can handle sections etc @@ -245,4 +249,4 @@ print doc_extractor("")(x_decl("myfunc(int x, int y)","c:/development/ocvs/ogrenew/ogremain/include/OgreSceneManager.h",218)) print doc_extractor("")(x_decl("","c:/development/ocvs/ogrenew/ogremain/include/OgreSceneManager.h",223)) - print doc_extractor("")(x_decl("","c:/development/CEGUI-0.5.0/include/CEGUIEvent.h",139)) \ No newline at end of file + print doc_extractor("")(x_decl("","c:/development/CEGUI-0.5.0/include/CEGUIEvent.h",139)) Modified: trunk/python-ogre/demos/caelum/Demo_Caelum01.py =================================================================== --- trunk/python-ogre/demos/caelum/Demo_Caelum01.py 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/demos/caelum/Demo_Caelum01.py 2007-10-06 11:17:27 UTC (rev 412) @@ -160,8 +160,7 @@ ## */ ## ## ==================================================================== - if self.spm: - self.spm = 0 + self.spm = None if self.caelumSystem: self.caelumSystem.shutdown(False) self.caelumSystem = None Modified: trunk/python-ogre/demos/caelum/plugins.cfg =================================================================== --- trunk/python-ogre/demos/caelum/plugins.cfg 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/demos/caelum/plugins.cfg 2007-10-06 11:17:27 UTC (rev 412) @@ -2,18 +2,18 @@ ## Use this for Windows # Define plugin folder -PluginFolder=../../plugins -Plugin=RenderSystem_GL.dll -Plugin=RenderSystem_Direct3D9.dll -Plugin=Plugin_ParticleFX.dll -Plugin=Plugin_BSPSceneManager.dll -Plugin=Plugin_OctreeSceneManager.dll -Plugin=Plugin_CgProgramManager.dll +PluginFolder=/home/andy/development/root/usr/lib/OGRE +#Plugin=RenderSystem_GL.dll +#Plugin=RenderSystem_Direct3D9.dll +#Plugin=Plugin_ParticleFX.dll +#Plugin=Plugin_BSPSceneManager.dll +#Plugin=Plugin_OctreeSceneManager.dll +#Plugin=Plugin_CgProgramManager.dll ## ## NOTE use this for MacOS or Linux -# Plugin=RenderSystem_GL -# Plugin=Plugin_ParticleFX -# Plugin=Plugin_BSPSceneManager -# Plugin=Plugin_OctreeSceneManager -# Plugin=Plugin_CgProgramManager + Plugin=RenderSystem_GL + Plugin=Plugin_ParticleFX + Plugin=Plugin_BSPSceneManager + Plugin=Plugin_OctreeSceneManager + Plugin=Plugin_CgProgramManager Modified: trunk/python-ogre/demos/et/plugins.cfg =================================================================== --- trunk/python-ogre/demos/et/plugins.cfg 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/demos/et/plugins.cfg 2007-10-06 11:17:27 UTC (rev 412) @@ -2,18 +2,18 @@ ## Use this for Windows # Define plugin folder -PluginFolder=../../plugins -Plugin=RenderSystem_GL.dll -Plugin=RenderSystem_Direct3D9.dll -Plugin=Plugin_ParticleFX.dll -Plugin=Plugin_BSPSceneManager.dll -Plugin=Plugin_OctreeSceneManager.dll -Plugin=Plugin_CgProgramManager.dll +PluginFolder=/home/andy/development/root/usr/lib/OGRE +#Plugin=RenderSystem_GL.dll +#Plugin=RenderSystem_Direct3D9.dll +#Plugin=Plugin_ParticleFX.dll +#Plugin=Plugin_BSPSceneManager.dll +#Plugin=Plugin_OctreeSceneManager.dll +#Plugin=Plugin_CgProgramManager.dll ## ## NOTE use this for MacOS or Linux -# Plugin=RenderSystem_GL -# Plugin=Plugin_ParticleFX -# Plugin=Plugin_BSPSceneManager -# Plugin=Plugin_OctreeSceneManager -# Plugin=Plugin_CgProgramManager + Plugin=RenderSystem_GL + Plugin=Plugin_ParticleFX + Plugin=Plugin_BSPSceneManager + Plugin=Plugin_OctreeSceneManager + Plugin=Plugin_CgProgramManager Modified: trunk/python-ogre/demos/ogre/plugins.cfg =================================================================== --- trunk/python-ogre/demos/ogre/plugins.cfg 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/demos/ogre/plugins.cfg 2007-10-06 11:17:27 UTC (rev 412) @@ -2,18 +2,18 @@ ## Use this for Windows # Define plugin folder -PluginFolder=../../plugins -Plugin=RenderSystem_GL.dll -Plugin=RenderSystem_Direct3D9.dll -Plugin=Plugin_ParticleFX.dll -Plugin=Plugin_BSPSceneManager.dll -Plugin=Plugin_OctreeSceneManager.dll -Plugin=Plugin_CgProgramManager.dll +PluginFolder=/home/andy/development/root/usr/lib/OGRE +#Plugin=RenderSystem_GL.dll +#Plugin=RenderSystem_Direct3D9.dll +#Plugin=Plugin_ParticleFX.dll +#Plugin=Plugin_BSPSceneManager.dll +#Plugin=Plugin_OctreeSceneManager.dll +#Plugin=Plugin_CgProgramManager.dll ## ## NOTE use this for MacOS or Linux -# Plugin=RenderSystem_GL -# Plugin=Plugin_ParticleFX -# Plugin=Plugin_BSPSceneManager -# Plugin=Plugin_OctreeSceneManager -# Plugin=Plugin_CgProgramManager + Plugin=RenderSystem_GL + Plugin=Plugin_ParticleFX + Plugin=Plugin_BSPSceneManager + Plugin=Plugin_OctreeSceneManager + Plugin=Plugin_CgProgramManager Modified: trunk/python-ogre/demos/qgui/plugins.cfg =================================================================== --- trunk/python-ogre/demos/qgui/plugins.cfg 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/demos/qgui/plugins.cfg 2007-10-06 11:17:27 UTC (rev 412) @@ -1,19 +1,19 @@ # Defines plugins to load -## User this for Windows +## Use this for Windows # Define plugin folder -PluginFolder=../../plugins -Plugin=RenderSystem_GL.dll -Plugin=RenderSystem_Direct3D9.dll -Plugin=Plugin_ParticleFX.dll -Plugin=Plugin_BSPSceneManager.dll -Plugin=Plugin_OctreeSceneManager.dll -Plugin=Plugin_CgProgramManager.dll +PluginFolder=/home/andy/development/root/usr/lib/OGRE +#Plugin=RenderSystem_GL.dll +#Plugin=RenderSystem_Direct3D9.dll +#Plugin=Plugin_ParticleFX.dll +#Plugin=Plugin_BSPSceneManager.dll +#Plugin=Plugin_OctreeSceneManager.dll +#Plugin=Plugin_CgProgramManager.dll ## ## NOTE use this for MacOS or Linux -# Plugin=RenderSystem_GL -# Plugin=Plugin_ParticleFX -# Plugin=Plugin_BSPSceneManager -# Plugin=Plugin_OctreeSceneManager -# Plugin=Plugin_CgProgramManager + Plugin=RenderSystem_GL + Plugin=Plugin_ParticleFX + Plugin=Plugin_BSPSceneManager + Plugin=Plugin_OctreeSceneManager + Plugin=Plugin_CgProgramManager Modified: trunk/python-ogre/environment.py =================================================================== --- trunk/python-ogre/environment.py 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/environment.py 2007-10-06 11:17:27 UTC (rev 412) @@ -248,8 +248,11 @@ class ogrenewt: active=True version = "1.0" - parent = "ogre/physics" - libs = ['Newton', Config.LIB_Boost, 'OgreNewt_Main', 'OgreMain'] + parent = "ogre/physics" + if os.name=="nt": + libs = ['Newton', Config.LIB_Boost, 'OgreNewt_Main', 'OgreMain'] + else: + libs = ['Newton', Config.LIB_Boost, 'OgreNewt', 'OgreMain'] include_dirs = [Config.PATH_Boost , Config.PATH_Newton # only one path for Newton , Config.PATH_INCLUDE_Ogre @@ -576,10 +579,24 @@ if os.name =='nt': CCFLAGS = ' -DOgreAL_Export="" -DWIN32 -DNDEBUG -D_LIB -D_WIN32 -D_WINDOWS -DVORBIS_IEEE_FLOAT32 -D_USE_NON_INTEL_COMPILER ' +<<<<<<< .mine libs=[Config.LIB_Boost, 'OgreMain', 'ogg_static', 'alut', 'vorbis_static','vorbisfile_static','vorbisenc_static', + 'OpenAL32', 'EFX-Util'] ## 'OgreAL' -- going to compile OgreAL ourselves + else: + libs=[Config.LIB_Boost, 'OgreMain', + 'ogg', + 'alut', + 'vorbis','vorbisfile','vorbisenc', + 'openal'] ## 'OgreAL' -- going to compile OgreAL ourselves + +======= + libs=[Config.LIB_Boost, 'OgreMain', + 'ogg_static', + 'alut', + 'vorbis_static','vorbisfile_static','vorbisenc_static', 'OpenAL32', 'EFX-Util'] ## 'OgreAL' -- going to compile OgreAL ourselves else: libs=[Config.LIB_Boost, 'OgreMain', @@ -587,6 +604,7 @@ 'alut', 'vorbis','vorbisfile','vorbisenc', 'openal'] ## 'OgreAL' -- going to compile OgreAL ourselves +>>>>>>> .r411 ModuleName = 'OgreAL' CheckIncludes = ['OgreAL.h'] active=True @@ -649,7 +667,23 @@ ModuleName = 'et' CheckIncludes = ['boost/python.hpp'] active=True - cflags = "" + cflags = "" + +class caelum: ## editable terrain + version= "2.2" + parent = "ogre/addons" + libs=[ Config.LIB_Boost, 'OgreMain' ] + lib_dirs = [ Config.PATH_LIB_Boost, + Config.PATH_LIB_Ogre_OgreMain + ] + include_dirs = [ Config.PATH_Boost, + Config.PATH_INCLUDE_Ogre, + Config.PATH_caelum + ] + ModuleName = 'caelum' + CheckIncludes = ['boost/python.hpp'] + active=True + cflags = "" class bullet: version= "2.62" @@ -749,8 +783,9 @@ , 'ogrebulletc' : ogrebulletc , 'ogrebulletd' : ogrebulletd , 'ogreforests' : ogreforests - , 'et' : et + , 'et' : et , 'caelum' : caelum + , 'caelum' : caelum } # Modified: trunk/python-ogre/scripts/00-PreReqs.sh =================================================================== --- trunk/python-ogre/scripts/00-PreReqs.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/00-PreReqs.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -3,4 +3,4 @@ sudo apt-get install g++ libfreetype6-dev libpcre3-dev autoconf automake1.9 libgl1-mesa-dev libx11-dev \ libglut3-dev libtool libxaw7-dev libxxf86vm-dev \ libxrandr-dev cvs subversion libxt-dev libexpat1-dev python python-dev \ -python-celementtree libglew-dev libzzip-dev +python-celementtree libglew-dev Modified: trunk/python-ogre/scripts/01-RetrieveSource.sh =================================================================== --- trunk/python-ogre/scripts/01-RetrieveSource.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/01-RetrieveSource.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -17,16 +17,16 @@ $WGET http://prdownloads.sourceforge.net/wgois/ois-1.0RC1.tar.gz $WGET http://prdownloads.sourceforge.net/boost/boost-jam-3.1.13-1-linuxx86.tgz $WGET http://prdownloads.sourceforge.net/scons/scons-0.96.96.tar.gz -$WGET http://prdownloads.sourceforge.net/ogre/ogre-linux_osx-v1-4-4.tar.bz2 +$WGET http://downloads.sourceforge.net/scons/scons-0.97.0d20070918.tar.gz +$WGET http://prdownloads.sourceforge.net/ogre/ogre-linux_osx-v1-4-5.tar.bz2 $WGET http://prdownloads.sourceforge.net/opende/ode-src-0.8.zip -$WGET http://prdownloads.sourceforge.net/bullet/bullet-2.62a.tgz $WGET http://downloads.sourceforge.net/boost/boost_1_34_0.tar.bz2 $WGET http://www.newtondynamics.com/downloads/newtonLinux-1.53.tar.gz $WGET http://www.openal.org/openal_webstf/downloads/openal-0.0.8.tar.gz $WGET http://www.openal.org/openal_webstf/downloads/freealut-1.1.0.tar.gz $WGET http://downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz $WGET http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.0.tar.gz -##$WGET http://devfiles.ageia.com/Physx_2.7.2_SDK_CoreLinux_deb.tar.gz +$WGET http://downloads.sourceforge.net/zziplib/zziplib-0.13.49.tar.bz2 popd cd $INSTALL_DIR echo " -- getting pygccxml" @@ -39,12 +39,6 @@ cvs -z3 -q -d :pserver:ano...@cv...:/cvsroot/ogre co -P ogreaddons/ogreode echo " -- getting ogrenewt" cvs -z3 -q -d :pserver:ano...@cv...:/cvsroot/ogre co -P ogreaddons/ogrenewt -echo " -- getting videoplugins" -cvs -z3 -q -d :pserver:ano...@cv...:/cvsroot/ogre co -P ogreaddons/videoplugin -echo " -- getting ogrebullet" -cvs -z3 -q -d :pserver:ano...@cv...:/cvsroot/ogre co -P ogreaddons/ogrebullet -echo " -- getting NxOgre" -svn co http://latest.nxogre.org/nxogre3/ NxOgre echo "" echo "======= Sources Retrieved =======" echo "" Modified: trunk/python-ogre/scripts/02-ExtractAndPatch.sh =================================================================== --- trunk/python-ogre/scripts/02-ExtractAndPatch.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/02-ExtractAndPatch.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -6,7 +6,8 @@ echo " == extracting ==" echo " -- Unpacking OGRE" -tar jxf $DOWNLOADS/ogre-linux_osx-v1-4-4.tar.bz2 +tar jxf $DOWNLOADS/ogre-linux_osx-v1-4-5.tar.bz2 +tar jxf $DOWNLOADS/zziplib-0.13.49.tar.bz2 echo " -- Unpacking Boost" tar jxf $DOWNLOADS/boost_1_34_0.tar.bz2 echo " -- Unpacking CEGUI" @@ -19,8 +20,6 @@ tar zxf $DOWNLOADS/newtonLinux-1.53.tar.gz echo " -- Unpacking ODE" unzip -q -o $DOWNLOADS/ode-src-0.8.zip -echo " -- Unpacking bullet" -tar zxf $DOWNLOADS/bullet-2.62a.tgz echo " -- Unpacking OgreAL Support" tar zxf $DOWNLOADS/libogg-1.1.3.tar.gz tar zxf $DOWNLOADS/libvorbis-1.2.0.tar.gz @@ -52,11 +51,11 @@ echo " -- Patching OgreOde" cd ogreaddons/ogreode -patch -s -i ../../python-ogre/patch/ogreode.patch -p0 +patch -s -N -i ../../python-ogre/patch/ogreode.patch -p0 cd $INSTALL_DIR echo " -- Patching OgreNewt" cd ogreaddons/ogrenewt -patch -s -i ../../python-ogre/patch/ogrenewt.patch -p0 +patch -s -N -i ../../python-ogre/patch/ogrenewt.patch -p0 cp SConscript OgreNewt_Main rm -r ./OgreNewt_Main/inc/boost cd $INSTALL_DIR @@ -76,11 +75,11 @@ cp -r python-ogre/boost/* boost_1_34_0 echo " -- Patching Ogre" -patch -s -i ./python-ogre/patch/ogre.patch -p0 +patch -s -N -i ./python-ogre/patch/ogre.patch -p0 echo " -- Patching CEGUI" pushd CEGUI-0.5.0 -patch -s -i ../python-ogre/patch/cegui.patch -p0 +patch -s -N -i ../python-ogre/patch/cegui.patch -p0 echo "EMPTY" >>./INSTALL echo "EMPTY" >>./NEWS popd Modified: trunk/python-ogre/scripts/03-BuildBaseLibs.sh =================================================================== --- trunk/python-ogre/scripts/03-BuildBaseLibs.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/03-BuildBaseLibs.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -6,6 +6,16 @@ echo " == Building base libraries == " # +# zlib as the one included in Ubuntu is buggy +# +echo " -- building zzlib --" +pushd zziplib-0.13.49 +aclocal +./configure --prefix=$PREFIX --datadir=$PREFIX/share +make +make install +popd +# # Install CEGUI (Crazy Eddie's GUI) # echo " -- Building CEGUI" @@ -49,11 +59,21 @@ # echo " -- Building Ogre" pushd ogrenew +aclocal ./bootstrap ./configure --prefix=$PREFIX make make install +cd ReferenceApplication +aclocal +./bootstrap +./configure --prefix=$PREFIX +make +make install +cd .. popd echo echo " ==== Finished building base libraries ====" + + Modified: trunk/python-ogre/scripts/05-BuildTools.sh =================================================================== --- trunk/python-ogre/scripts/05-BuildTools.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/05-BuildTools.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -36,7 +36,7 @@ PREFIX=/usr/local EPREFIX=/usr/local EOF -patch -p0 < boost.patch +patch -N -p0 < boost.patch sed -i s/'BOOST_PYTHON_MAX_ARITY 15'/'BOOST_PYTHON_MAX_ARITY 19'/ boost/python/detail/preprocessor.hpp make make install @@ -50,6 +50,14 @@ python setup.py install --prefix=$PREFIX cd .. +echo " -- installing SCONs" +rm -rf scons-0.97.0d20070918 +tar -xvzf $DOWNLOADS/scons-0.97.0d20070918.tar.gz --overwrite +cd scons-0.97.0d20070918 +####python setup.py install --prefix=$PREFIX +cd .. + + # py++ echo " -- installing PY++" cd pygccxml/pygccxml_dev Modified: trunk/python-ogre/scripts/06-GenerateCode.sh =================================================================== --- trunk/python-ogre/scripts/06-GenerateCode.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/06-GenerateCode.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -3,70 +3,66 @@ # master config setup source ./config.sh -echo "=== generating code ===" -echo "=== generating code ===" >> $INSTALL_DIR/log.out cd python-ogre/code_generators if [ $1 != "" ] then - cd $1 - python generate_code.py > build.out - cd .. + echo "=== generating $1 ===" + echo "=== generating $1 ===" >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh $1 else -echo ' -- creating OGRE code' -echo ' -- creating OGRE code' >> $INSTALL_DIR/log.out -cd ogre -python generate_code.py > build.out -cd .. -echo ' -- creating OGRErefapp code' -echo ' -- creating OGRErefapp code'>> $INSTALL_DIR/log.out -cd ogrerefapp -python generate_code.py > build.out -cd .. -echo ' -- creating quickgui code' -echo ' -- creating quickgui code'>> $INSTALL_DIR/log.out -cd quickgui -python generate_code.py > build.out -cd .. -echo ' -- creating OIS code' -echo ' -- creating OIS code'>> $INSTALL_DIR/log.out -cd ois -python generate_code.py > build.out -cd .. -echo ' -- creating CEGUI code' -echo ' -- creating CEGUI code'>> $INSTALL_DIR/log.out -cd cegui -python generate_code.py > build.out -cd .. -echo ' -- creating OgreAL code' -echo ' -- creating OgreAL code'>> $INSTALL_DIR/log.out -cd ogreal -python generate_code.py > build.out -cd .. -echo ' -- creating OGREode code' -echo ' -- creating OGREode code'>> $INSTALL_DIR/log.out -cd ogreode -python generate_code.py > build.out -cd .. -echo ' -- creating PLIB code' -echo ' -- creating PLIB code'>> $INSTALL_DIR/log.out -cd plib -python generate_code.py > build.out -cd .. -echo ' -- creating Theora code' -echo ' -- creating Theora code'>> $INSTALL_DIR/log.out -cd theora -python generate_code.py > build.out -cd .. -echo ' -- creating OGREnewt code' -echo ' -- creating OGREnewt code' >> $INSTALL_DIR/log.out -cd ogrenewt -python generate_code.py > build.out -cd .. -echo ' -- creating ode code' -cd ode -python generate_code.py > build.out -cd .. +# echo ' -- creating OGRE code' +# echo ' -- creating OGRE code' >> $INSTALL_DIR/log.out +# $INSTALL_DIR/gen_code.sh ogre + +# echo ' -- creating OGRErefapp code' +# echo ' -- creating OGRErefapp code'>> $INSTALL_DIR/log.out +# $INSTALL_DIR/gen_code.sh ogrerefapp + + echo ' -- creating quickgui code' + echo ' -- creating quickgui code'>> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh quickgui + + echo ' -- creating OIS code' + echo ' -- creating OIS code'>> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ois + +# echo ' -- creating CEGUI code' +# echo ' -- creating CEGUI code'>> $INSTALL_DIR/log.out +# $INSTALL_DIR/gen_code.sh cegui + + echo ' -- creating OgreAL code' + echo ' -- creating OgreAL code'>> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ogreal + + echo ' -- creating OGREode code' + echo ' -- creating OGREode code'>> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ogreode + + echo ' -- creating PLIB code' + echo ' -- creating PLIB code'>> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh plib + + #echo ' -- creating Theora code' + #echo ' -- creating Theora code'>> $INSTALL_DIR/log.out + #$INSTALL_DIR/gen_code.sh theora + + echo ' -- creating OGREnewt code' + echo ' -- creating OGREnewt code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ogrenewt + + echo ' -- creating ode code' + echo ' -- creating ode code' >> $INSTALL_DIR/log.out + $INSTALL_DIR/gen_code.sh ode + +# echo ' -- creating et code' +# echo ' -- creating et code' >> $INSTALL_DIR/log.out +# $INSTALL_DIR/gen_code.sh et + +# echo ' -- creating caelum code' +# echo ' -- creating caelum code' >> $INSTALL_DIR/log.out +# $INSTALL_DIR/gen_code.sh caelum + fi cd $INSTALL_DIR echo Modified: trunk/python-ogre/scripts/07-BuildModules.sh =================================================================== --- trunk/python-ogre/scripts/07-BuildModules.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/07-BuildModules.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -12,7 +12,7 @@ then scons PROJECTS=$1 else - scons PROJECTS=ogre,ois,quickgui,cegui,plib,ogreode,ogrenewt,ogreal + scons PROJECTS=ogre,ois,cegui,plib,ogreode,ogrenewt,ogreal,quickgui,et,caelum fi #opcode -- not really suited to a linux build -- lots of work needed ? # Modified: trunk/python-ogre/scripts/config.sh =================================================================== --- trunk/python-ogre/scripts/config.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/config.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -19,7 +19,7 @@ export LD_LIBRARY_PATH=$PREFIX/lib export CFLAGS="-I$PREFIX/include -L$PREFIX/lib" export CXXFLAGS=$CFLAGS -export PATH=$PATH:$PREFIX/bin +export PATH=$PREFIX/bin:$PATH export PYTHONPATH=$PREFIX/lib/python$PYTHONVERSION/site-packages mkdir -p $PREFIX Modified: trunk/python-ogre/scripts/master.sh =================================================================== --- trunk/python-ogre/scripts/master.sh 2007-10-06 10:45:04 UTC (rev 411) +++ trunk/python-ogre/scripts/master.sh 2007-10-06 11:17:27 UTC (rev 412) @@ -7,8 +7,8 @@ source ./05-BuildTools.sh source ./03-BuildBaseLibs.sh source ./04-BuildAdditionalLibs.sh -source ./06-GenerateCode.sh -source ./07-BuildModules.sh +#source ./06-GenerateCode.sh +#source ./07-BuildModules.sh This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-06 10:45:01
|
Revision: 411 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=411&view=rev Author: andy_miller Date: 2007-10-06 03:45:04 -0700 (Sat, 06 Oct 2007) Log Message: ----------- Updates to the 1.1 release -- a few last minute demo fixes Modified Paths: -------------- trunk/python-ogre/SConstruct trunk/python-ogre/demos/navi/Demo_navi.py trunk/python-ogre/demos/plib/Demo_Client.py trunk/python-ogre/demos/plib/Demo_Server.py trunk/python-ogre/demos/qgui/Demo_QuickGUI01.py trunk/python-ogre/environment.py Added Paths: ----------- trunk/python-ogre/SourceSnapShots/Python-Ogre-V1.1-SnapShot.7z trunk/python-ogre/demos/ogre/Demo_Water.py trunk/python-ogre/demos/ogre/WaterMesh.py Removed Paths: ------------- trunk/python-ogre/packages_2.5/ogre/renderer/OGREdshow/ Modified: trunk/python-ogre/SConstruct =================================================================== --- trunk/python-ogre/SConstruct 2007-10-05 13:06:34 UTC (rev 410) +++ trunk/python-ogre/SConstruct 2007-10-06 10:45:04 UTC (rev 411) @@ -157,10 +157,13 @@ ## ugly hack - scons returns a list of targets from SharedLibrary - we have to choose the one we want index = 0 # this is the index into a list of targets - '0' should be the platform default - - ## and lets have it install the output into the 'package_dir_name/ModuleName' dir and rename to the PydName - _env.AddPostAction(package,\ - 'mt.exe -nologo -manifest %(name)s.manifest -outputresource:%(name)s;2' % { 'name':package[index] } ) + if os.name=="nt" + ## and lets have it install the output into the 'package_dir_name/ModuleName' dir and rename to the PydName + _env.AddPostAction(package,\ + 'mt.exe -nologo -manifest %(name)s.manifest -outputresource:%(name)s;2' % { 'name':package[index] } ) + else: + _env.AddPostAction(package,\ + '-strip --debug %(name)s' % { 'name':package[index] } ) _env.InstallAs(os.path.join(environment.package_dir_name, cls.parent, cls.ModuleName, cls.PydName), Added: trunk/python-ogre/SourceSnapShots/Python-Ogre-V1.1-SnapShot.7z =================================================================== (Binary files differ) Property changes on: trunk/python-ogre/SourceSnapShots/Python-Ogre-V1.1-SnapShot.7z ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/python-ogre/demos/navi/Demo_navi.py =================================================================== --- trunk/python-ogre/demos/navi/Demo_navi.py 2007-10-05 13:06:34 UTC (rev 410) +++ trunk/python-ogre/demos/navi/Demo_navi.py 2007-10-06 10:45:04 UTC (rev 411) @@ -19,7 +19,7 @@ def _createScene(self): sceneManager = self.sceneManager camera = self.camera - self.naviMgr = navi.NaviManager.Get() + self.naviMgr = navi.NaviManager(self.renderWindow) self.shouldQuit = False # flag to allow the app to do a shutdown sceneManager.ambientLight = ogre.ColourValue(0.5, 0.5, 0.5) @@ -41,8 +41,8 @@ node.scale=(.2, .2, .2) ## Startup, create, and manage Navis - self.naviMgr.Startup(self.renderWindow) - +# # self.naviMgr.Startup(self.renderWindow) + self.naviMgr.createNavi("menubar", "local://menubar.html", navi.NaviPosition(navi.BottomCenter), 1024, 128, False) self.naviMgr.setNaviMask("menubar", "navimenu_bg.png") self.naviMgr.bind("menubar", "turnOn", self, "turnOn", ["name"] ) Added: trunk/python-ogre/demos/ogre/Demo_Water.py =================================================================== --- trunk/python-ogre/demos/ogre/Demo_Water.py (rev 0) +++ trunk/python-ogre/demos/ogre/Demo_Water.py 2007-10-06 10:45:04 UTC (rev 411) @@ -0,0 +1,619 @@ +# This code is in the Public Domain +# ----------------------------------------------------------------------------- +# This source file is part of Python-Ogre +# For the latest info, see http://python-Ogre.org/ +# +# It is likely based on original code from OGRE and/or PyOgre +# For the latest info, see http://www.ogre3d.org/ +# +# You may use this sample code for anything you like, it is not covered by the +# LGPL. +# ----------------------------------------------------------------------------- +# */ +# /* Static water simulation by eru +# * Started 29.05.2003, 20:54:37 +# */ + +#include "ExampleApplication.h" +import ogre.renderer.OGRE as Ogre +import ogre.io.OIS as OIS +import WaterMesh as WaterMesh +import math +import SampleFramework as sf +import random +import ctypes as ctypes + +# AnimationState* self.mAnimState + +## Mesh stuff +MESH_NAME ="WaterMesh" +ENTITY_NAME ="waterEntity" +MATERIAL_PREFIX ="Examples/Water" +MATERIAL_NAME ="Examples/Water0" +COMPLEXITY =64 ## watch out - number of polys is 2*ACCURACY*ACCURACY ! +PLANE_SIZE =3000.0 + +circles_MATERIAL ="Examples/Water/self.circles" + +## +## Note that this function makes use of CTypes and def ptr casting to access Ogre Library functions +## +def prepareCircleMaterial(): + global circles_MATERIAL + + storageclass = ctypes.c_byte * (256 * 256 * 4) + bmap=storageclass(1) # you just need to put some value in this to get it started... + ctypes.memset ( bmap, 127, 256 * 256 * 4 ) + + for b in range(16): + x0 = b % 4 + y0 = b >> 2 + radius = 4.0 + 1.4 * b + for x in range(64): + for y in range (64) : + dist = math.sqrt((x-32)*(x-32)+(y-32)*(y-32)) ## 0..ca.45 + dist = math.fabs(dist-radius-2) / 2.0 + dist = dist * 255 + if (dist>255): + dist=255 + colour = 255-dist + colour = int (((15-b))/15.0 * colour ) + + bmap[4*(256*(y+64*y0)+x+64*x0)+0]=colour + bmap[4*(256*(y+64*y0)+x+64*x0)+1]=colour + bmap[4*(256*(y+64*y0)+x+64*x0)+2]=colour + bmap[4*(256*(y+64*y0)+x+64*x0)+3]=colour + + ### Need to pass the address to MemoryDataStream + ## + imgstream = Ogre.MemoryDataStream(pMem=Ogre.CastVoidPtr(ctypes.addressof(bmap)), size = int(256 * 256 *4) ) + print dir (imgstream) + print imgstream.size() + Ogre.TextureManager.getSingleton().loadRawData(circles_MATERIAL, + Ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, + imgstream, 256, 256 , Ogre.PixelFormat.PF_A8R8G8B8 ) + + material = Ogre.MaterialManager.getSingleton().create( circles_MATERIAL, + Ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME) + texLayer = material.getTechnique(0).getPass(0).createTextureUnitState( circles_MATERIAL ) + texLayer.setTextureAddressingMode( Ogre.TextureUnitState.TAM_CLAMP ) + material.setSceneBlending( Ogre.SceneBlendType.SBT_ADD ) + material.setDepthWriteEnabled( False ) + material.load() + + + +# /* =========================================================================*/ +# /* WaterCircle class */ +# /* =========================================================================*/ +CIRCLE_SIZE = 500.0 +CIRCLE_TIME = 0.5 +class WaterCircle: + def __init_(self): + self.name = "" +# SceneNode *node +# MeshPtr mesh +# SubMesh *subMesh +# Entity *entity +# Real tm +# static bool first +# ## some buffers shared by all self.circles +# static HardwareVertexBufferSharedPtr posnormVertexBuffer +# static HardwareIndexBufferSharedPtr indexBuffer ## indices for 2 faces +# static HardwareVertexBufferSharedPtr *texcoordsVertexBuffers + +# float *texBufData + self.headNode = None + self.waterOverlay = None + self.particleSystem = None + self.particleEmitter = None + self.sceneMgr = None + + _prepareMesh() + + mesh = Ogre.MeshManager.getSingleton().createManual(name, + Ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME) + subMesh = mesh.createSubMesh() + subMesh.useSharedVertices=False + numVertices = 4 + first = True + + if (first) : ## first Circle, create some static common data: + first = False + + ## static buffer for position and normals + size = 2 * Ogre.VertexElement.getTypeSize(Ogre.VertexElementType.VET_FLOAT3) ## 6 * float + posnormVertexBuffer = \ + Ogre.HardwareBufferManager.getSingleton().createVertexBuffer( + size, ## size of one vertex data 6 * float + 4, ## number of vertices + Ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, ## usage + False) ## no shadow buffer + posnormBufData = posnormVertexBuffer.lock(Ogre.HardwareBuffer.HBL_DISCARD) + + buff=[] + for i in range(numVertices): + buf.append(((i%2)-0.5)*CIRCLE_SIZE ) ## pos X + buf.append(0) ## pos Y + buf.append(((i/2)-0.5)*CIRCLE_SIZE ) ## pos Z + buf.append(0) ## normal X + buf.append(1) ## normal Y + buf.append(0) ## normal Z + Ogre.setFloat( posnormBufData , buff ) # write unsigned ints... + posnormVertexBuffer.unlock() + + ## static buffers for 16 sets of texture coordinates + texcoordsVertexBuffers = [] + for lvl in range (16): + texcoordsVertexBuffers.append( + Ogre.HardwareBufferManager.getSingleton().createVertexBuffer( + Ogre.VertexElement.getTypeSize(Ogre.VertexElementType.VET_FLOAT2), ## size of one vertex data + numVertices, ## number of vertices + Ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, ## usage + False) ## no shadow buffer + ) + texcoordsBufData = texcoordsVertexBuffers[lvl].lock(Ogre.HardwareBuffer.HBL_DISCARD) + x0 = (lvl % 4) * 0.25 + y0 = (lvl / 4) * 0.25 + y0 = 0.75-y0 ## upside down + for i in range (4): + texcoordsBufData[i*2 + 0]= \ + x0 + 0.25 * (i%2) + texcoordsBufData[i*2 + 1]= \ + y0 + 0.25 * (i/2) + + texcoordsVertexBuffers[lvl].unlock() + + + ## Index buffer for 2 faces + faces[6] = (2,1,0, 2,3,1) + indexBuffer = \ + Ogre.HardwareBufferManager.getSingleton().createIndexBuffer( + Ogre.HardwareIndexBuffer.IT_16BIT, + 6, + Ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY) + indexBuffer.writeData(0, + indexBuffer.getSizeInBytes(), + faces, + True) ## true? + + + ## Initialize vertex data + subMesh.vertexData = Ogre.VertexData() + subMesh.vertexData.vertexStart = 0 + subMesh.vertexData.vertexCount = 4 + ## first, set vertex buffer bindings + vbind = subMesh.vertexData.vertexBufferBinding + vbind.setBinding(0, posnormVertexBuffer) + vbind.setBinding(1, texcoordsVertexBuffers[0]) + ## now, set vertex buffer declaration + vdecl = subMesh.vertexData.vertexDeclaration + vdecl.addElement(0, 0, Ogre.VET_FLOAT3, VOgre.ES_POSITION) + vdecl.addElement(0, 3*4, Ogre.VET_FLOAT3, Ogre.VES_NORMAL) + vdecl.addElement(1, 0, Ogre.VET_FLOAT2, Ogre.VES_TEXTURE_COORDINATES) + + ## Initialize index data + subMesh.indexData.indexBuffer = indexBuffer + subMesh.indexData.indexStart = 0 + subMesh.indexData.indexCount = 6 + + ## set mesh bounds + circleBounds(-CIRCLE_SIZE/2.0, 0, -CIRCLE_SIZE/2.0, + CIRCLE_SIZE/2.0, 0, CIRCLE_SIZE/2.0) + mesh._setBounds(circleBounds) + mesh.load() + mesh.touch() + + def setTextureLevel(): + subMesh.vertexData.vertexBufferBinding.setBinding(1, texcoordsVertexBuffers[lvl]) + + def WaterCircle( name, x, y): + + self.name = name + _prepareMesh() + node = self.sceneMgr.getRootSceneNode().createChild(name) + node.translate(x*(PLANE_SIZE/COMPLEXITY), 10, y*(PLANE_SIZE/COMPLEXITY)) + entity = self.sceneMgr.createEntity(name, name) + entity.setMaterialName(self.circles_MATERIAL) + node.attachObject(entity) + tm = 0 + lvl = 0 + setTextureLevel() + + def __del__(self, ): + Ogre.MeshManager.getSingleton().remove(mesh.getHandle()) + self.sceneMgr.destroyEntity(entity.getName()) + self.sceneMgr.getRootSceneNode().removeChildnode.getName() + + def animate(self, timeSinceLastFrame): + lastlvl = lvl + tm += timeSinceLastFrame + lvl = (int) ( (Real)(tm)/CIRCLE_TIME * 16 ) + if (lvl<16 and lvl!=lastlvl) : + setTextureLevel() + + + def clearStaticBuffers(self): + posnormVertexBuffer = Ogre.HardwareVertexBufferSharedPtr() + indexBuffer = Ogre.HardwareIndexBufferSharedPtr() + for i in range (16): + texcoordsVertexBuffers[i] = Ogre.HardwareVertexBufferSharedPtr() + + del texcoordsVertexBuffers + + +# bool WaterCircle.first = True +# HardwareVertexBufferSharedPtr WaterCircle.posnormVertexBuffer = +# HardwareVertexBufferSharedPtr() +# HardwareIndexBufferSharedPtr WaterCircle.indexBuffer = +# HardwareIndexBufferSharedPtr() +# HardwareVertexBufferSharedPtr* WaterCircle.texcoordsVertexBuffers = 0 + +# /* =========================================================================*/ +# /* WaterListener class */ +# /* =========================================================================*/ +## Event handler +class WaterListener(sf.FrameListener): + + def processcircles(self,timeSinceLastFrame): + + for i in self.circles : + self.circles[i].animate(timeSinceLastFrame) + +# # # do : +# # # found = False +# # # for it = self.circles : +# # # it != self.circles.end() +# # # ++it) { +# # # if ((*it).lvl>=16) {: +# # # delete (*it) +# # # self.circles.erase(it) +# # # found = True +# # # break + + +# # # while (found) + + + def processParticles(self): + global PLANE_SIZE, COMPLEXITY, RAIN_HEIGHT_RANDOM, RAIN_HEIGHT_CONSTANT + + ## Sorry this isn't currently supported by ogre - haven't exposed Ogre::ParticleIterator + return + + + pit = self.app.particleSystem._getIterator() + while not pit.end(): + particle = pit.getNext() + ppos = particle.position + if ppos.y<=0 and particle.timeToLive>0 : ## hits the water!: + ## delete particle + particle.timeToLive = 0.0 + ## push the water + x = ppos.x / PLANE_SIZE * COMPLEXITY + y = ppos.z / PLANE_SIZE * COMPLEXITY + h = random.random() % RAIN_HEIGHT_RANDOM + RAIN_HEIGHT_CONSTANT + if (x<1): + x=1 + if (x>COMPLEXITY-1): + x=COMPLEXITY-1 + if (y<1): + y=1 + if (y>COMPLEXITY-1): + y=COMPLEXITY-1 + self.WaterMesh.push(x,y,-h) + circle = WaterCircle( + "Circle#"+str(self.pindex), + x, y) + self.pindex+=1 + self.circles.push_back(circle) + + + + + ## Head animation */ + def animateHead(self, timeSinceLastFrame): + + ## sine track? :) + for i in range(4): + self.sines[i]+=self.adds[i]*timeSinceLastFrame + + tx = ((math.sin(self.sines[0]) + math.sin(self.sines[1])) / 4 + 0.5 ) * (COMPLEXITY-2) + 1 + ty = ((math.sin(self.sines[2]) + math.sin(self.sines[3])) / 4 + 0.5 ) * (COMPLEXITY-2) + 1 + self.WaterMesh.push(tx,ty, -self.headDepth) + step = PLANE_SIZE / COMPLEXITY + self.app.headNode.resetToInitialState() + self.app.headNode.setScale((3,3,3)) + newPos = Ogre.Vector3(step*tx, self.headDepth, step*ty) + diffPos = newPos - self.oldPos + headRotation = Ogre.Vector3.UNIT_Z.getRotationTo(diffPos) + self.oldPos = newPos + self.app.headNode.translate(newPos) + self.app.headNode.rotate(headRotation) + + + ## GUI updaters + def updateInfoParamC(self): + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/Param_C") \ + .setCaption("[1/2]Ripple speed: "+str(self.WaterMesh.PARAM_C)) + + def updateInfoParamD(self): + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/Param_D") \ + .setCaption("[3/4]Distance: "+str(self.WaterMesh.PARAM_D)) + + def updateInfoParamU(self): + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/Param_U") \ + .setCaption("[5/6]Viscosity: "+str(self.WaterMesh.PARAM_U)) + + def updateInfoParamT(self): + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/Param_T") \ + .setCaption("[7/8]Frame time: "+str(self.WaterMesh.PARAM_T)) + + def updateInfoNormals(self): + cap = "[N]Normals: " + if self.WaterMesh.useFakeNormals: + cap += "fake" + else: cap += "real" + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/Normals") \ + .setCaption(cap) + + def switchNormals(self): + self.WaterMesh.useFakeNormals = not self.WaterMesh.useFakeNormals + self.updateInfoNormals() + + def updateInfoHeadDepth(self): + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/Depth").setCaption("[U/J]Head depth: "+str(self.headDepth)) + + def updateInfoSkyBox(self): + cap = "[B]SkyBox: " + if self.skyBoxOn: + cap += "On" + else: cap += "Off" + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/SkyBox").setCaption(cap) + + def updateMaterial(self): + global MATERIAL_PREFIX + materialName = MATERIAL_PREFIX+str(self.materialNumber) + material = Ogre.MaterialManager.getSingleton().getByName(materialName) + if not material: + if(self.materialNumber): + self.materialNumber = 0 + self.updateMaterial() + return + else: + Ogre.OGRE_EXCEPT(Exception.ERR_INTERNAL_ERROR, + "Material "+materialName+"doesn't exist!", + "WaterListener.updateMaterial") + + self.waterEntity.setMaterialName(materialName) + Ogre.OverlayManager.getSingleton().getOverlayElement("Example/Water/Material").setCaption("[M]Material: "+materialName) + + + def switchMaterial(self): + self.materialNumber+=1 + self.updateMaterial() + + def switchSkyBox(self): + self.skyBoxOn = not self.skyBoxOn + self.app.sceneManager.setSkyBox(self.skyBoxOn, "Examples/SceneSkyBox2") + self.updateInfoSkyBox() + + + def __init__(self, renderWindow, camera, WaterMesh, waterEntity, app ): + + sf.FrameListener.__init__(self, renderWindow, camera) + self.app = app + self.camera = camera + self.WaterMesh = WaterMesh + self.waterEntity = waterEntity + self.materialNumber = 8 + self.timeoutDelay = 0.0 + self.headDepth = 2.0 + self.skyBoxOn = False + RAIN_HEIGHT_RANDOM = 5 + RAIN_HEIGHT_CONSTANT = 5 + self.sines = [0,100,200,300] + self.adds=[0.3,-1.6,1.1,0.5] + self.oldPos = Ogre.Vector3.UNIT_Z + self.pindex = 0 + self.headDepth =0.0 + self.circles = [] + + self.updateMaterial() + self.updateInfoParamC() + self.updateInfoParamD() + self.updateInfoParamU() + self.updateInfoParamT() + self.updateInfoNormals() + self.updateInfoHeadDepth() + self.updateInfoSkyBox() + + + def __del__ ( self ): + ## If when you finish the application is still raining there + ## are water self.circles that are still being processed + activecircles = self.circles.size () + + ## Kill the active water self.circles + for i in range ( activecircles ): + del (self.circles[i]) + + + def frameStarted(self, frameEvent): + result = sf.FrameListener.frameStarted(self,frameEvent) + evt = frameEvent + + if( result == False ): + ## check if we are exiting, if so, clear static HardwareBuffers to adef segfault + WaterCircle.clearStaticBuffers() + return False + + self.app.mAnimState.addTime(evt.timeSinceLastFrame) + + ## process keyboard events + changeSpeed = evt.timeSinceLastFrame + + ## adjust keyboard speed with SHIFT (increase) and CONTROL (decrease) + if (self.Keyboard.isKeyDown(OIS.KC_LSHIFT) or self.Keyboard.isKeyDown(OIS.KC_RSHIFT)): + changeSpeed *= 10.0 + + if (self.Keyboard.isKeyDown(OIS.KC_LCONTROL)): + changeSpeed /= 10.0 + + ## rain + self.processcircles(evt.timeSinceLastFrame) + if (self.Keyboard.isKeyDown(OIS.KC_SPACE)): + self.app.particleEmitter.setEmissionRate(20.0) + else: + self.app.particleEmitter.setEmissionRate(0.0) + + self.processParticles() + + ## adjust values (some macros for faster change + def ADJUST_RANGE(_value,_plus,_minus,_minVal,_maxVal,_change,_macro): + if (self.Keyboard.isKeyDown(_plus)): + _value+=_change + if (_value>=_maxVal): + _value = _maxVal + _macro + if (self.Keyboard.isKeyDown(_minus)): + _value-=_change + if (_value<=_minVal): + _value = _minVal + _macro + + + ADJUST_RANGE(self.headDepth, OIS.KC_U, OIS.KC_J, 0, 10, 0.5*changeSpeed, self.updateInfoHeadDepth()) + + ADJUST_RANGE(self.WaterMesh.PARAM_C, OIS.KC_2, OIS.KC_1, 0, 10, 0.1*changeSpeed, self.updateInfoParamC()) + + ADJUST_RANGE(self.WaterMesh.PARAM_D, OIS.KC_4, OIS.KC_3, 0.1, 10, 0.1*changeSpeed, self.updateInfoParamD()) + + ADJUST_RANGE(self.WaterMesh.PARAM_U, OIS.KC_6, OIS.KC_5, -2, 10, 0.1*changeSpeed, self.updateInfoParamU()) + + ADJUST_RANGE(self.WaterMesh.PARAM_T, OIS.KC_8, OIS.KC_7, 0, 10, 0.1*changeSpeed, self.updateInfoParamT()) + + self.timeoutDelay-=evt.timeSinceLastFrame + if (self.timeoutDelay<=0): + self.timeoutDelay = 0 + + def SWITCH_VALUE(_key,_timeDelay, _macro): + if (self.Keyboard.isKeyDown(_key) and self.timeoutDelay==0) : + self.timeoutDelay = _timeDelay + _macro + + SWITCH_VALUE(OIS.KC_N, 0.5, self.switchNormals()) + + SWITCH_VALUE(OIS.KC_M, 0.5, self.switchMaterial()) + + SWITCH_VALUE(OIS.KC_B, 0.5, self.switchSkyBox()) + + self.animateHead(evt.timeSinceLastFrame) + + self.WaterMesh.updateMesh(evt.timeSinceLastFrame) + + return True + + + +class WaterApplication(sf.Application,Ogre.RenderTargetListener): + +## Just override the mandatory create scene method + def _createScene(self): + global PLANE_SIZE, MESH_NAME, COMPLEXITY, ENTITY_NAME + print "\n\n\n***********" + sceneManager = self.sceneManager + camera = self.camera + ## Set ambient light + sceneManager.setAmbientLight(Ogre.ColourValue(0.75, 0.75, 0.75)) + + ## Create a light + l = sceneManager.createLight("MainLight") + ## Accept default settings: point light, white diffuse, just set position + l.setPosition(200,300,100) + +# ## Create water mesh and entity + self.WaterMesh = WaterMesh.WaterMesh(MESH_NAME, PLANE_SIZE, COMPLEXITY) + self.waterEntity = sceneManager.createEntity(ENTITY_NAME, MESH_NAME) + + ## self.waterEntity.setMaterialName(MATERIAL_NAME) + waterNode = sceneManager.getRootSceneNode().createChildSceneNode() +# waterNode.attachObject(self.waterEntity) + + ## Add a head, give it it's own node + self.headNode = waterNode.createChildSceneNode() + ent = sceneManager.createEntity("head", "ogrehead.mesh") + self.headNode.attachObject(ent) + + ## Make sure the camera track self node + ## self.camera.setAutoTracking(True, self.headNode) + + ## Create the camera node, set its position & attach camera + camNode = sceneManager.getRootSceneNode().createChildSceneNode() + camNode.translate(0, 500, PLANE_SIZE) + camNode.yaw(Ogre.Degree(-45)) + camNode.attachObject(self.camera) + + ## Create light node + lightNode = sceneManager.getRootSceneNode().createChildSceneNode() + lightNode.attachObject(l) + + ## set up spline animation of light node + anim = sceneManager.createAnimation("WaterLight", 20) + + ## create a random spline for light + track = anim.createNodeTrack(0, lightNode) + key = track.createNodeKeyFrame(0) + for ff in range (1,20): + key = track.createNodeKeyFrame(ff) + lpos = Ogre.Vector3( + random.random()%PLANE_SIZE , ##- PLANE_SIZE/2, + random.random()%300+100, + random.random()%PLANE_SIZE ##- PLANE_SIZE/2 + ) + key.setTranslate(lpos) + + key = track.createNodeKeyFrame(20) + + ## Create a new animation state to track self + self.mAnimState = sceneManager.createAnimationState("WaterLight") + self.mAnimState.setEnabled(True) + + ## Put in a bit of fog for the hell of it + ##sceneManager.setFog(FOG_EXP, ColourValue.White, 0.0002) + + ## show overlay + self.waterOverlay = Ogre.OverlayManager.getSingleton().getByName("Example/WaterOverlay") + self.waterOverlay.show() + + ## Let there be rain + self.particleSystem = sceneManager.createParticleSystem("rain", + "Examples/Water/Rain") + self.particleEmitter = self.particleSystem.getEmitter(0) + rNode = sceneManager.getRootSceneNode().createChildSceneNode() + rNode.translate(PLANE_SIZE/2.0, 3000, PLANE_SIZE/2.0) + rNode.attachObject(self.particleSystem) + ## Fast-forward the rain so it looks more natural + self.particleSystem.fastForward(20) + ## It can't be set in .particle file, and we need it ) +# static_cast<BillboardParticleRenderer*>(self.particleSystem.getRenderer()).setBillboardOrigin(BBO_BOTTOM_CENTER) + + prepareCircleMaterial() + print "\n\n\n***********" + + +# ## Create new frame listener + def _createFrameListener(self): + self.frameListener = WaterListener(self.renderWindow, self.camera, + self.WaterMesh, self.waterEntity, self) + self.root.addFrameListener(self.frameListener) + + + +if __name__ == '__main__': +# try: + application = WaterApplication() + application.go() +# except Ogre.Exception, e: +# print e + Added: trunk/python-ogre/demos/ogre/WaterMesh.py =================================================================== --- trunk/python-ogre/demos/ogre/WaterMesh.py (rev 0) +++ trunk/python-ogre/demos/ogre/WaterMesh.py 2007-10-06 10:45:04 UTC (rev 411) @@ -0,0 +1,341 @@ +# /* +# ----------------------------------------------------------------------------- +# This source file is part of OGRE +# (Object-oriented Graphics Rendering Engine) +# For the latest info, see http:##www.ogre3d.org/ + +# Copyright (c) 2000-2006 Torus Knot Software Ltd +# Also see acknowledgements in Readme.html + +# You may use self sample code for anything you like, it is not covered by the +# LGPL like the rest of the engine. +# ----------------------------------------------------------------------------- +# */ + +import ctypes as ctypes +import math +import ogre.renderer.OGRE as Ogre +import random + +ANIMATIONS_PER_SECOND = 100.0 +class WaterMesh: + def __init__ ( self, meshName, planeSize, complexity ): + self.meshName = meshName + self.complexity = complexity + self.numFaces = 2 * complexity * complexity + self.numVertices = (complexity + 1) * (complexity + 1) + self.lastTimeStamp = 0 + self.lastAnimationTimeStamp = 0 + self.lastFrameTime = 0 + self.vNormals=[] + + ## initialize algorithm parameters + self.PARAM_C = 0.3 ## ripple speed + self.PARAM_D = 0.4 ## distance + self.PARAM_U = 0.05 ## viscosity + self.PARAM_T = 0.13 ## time + self.useFakeNormals = False + + ## allocate space for normal calculation + self.vNormals=[] + for x in range ( self.numVertices ): + self.vNormals.append(Ogre.Vector3() ) + + ## create mesh and submesh + mesh = Ogre.MeshManager.getSingleton().createManual(meshName, + Ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME) + subMesh = mesh.createSubMesh() + subMesh.useSharedVertices=False + + ## Vertex buffers + subMesh.vertexData = Ogre.VertexData() + subMesh.vertexData.vertexStart = 0 + subMesh.vertexData.vertexCount = self.numVertices + + vdecl = subMesh.vertexData.vertexDeclaration + vbind = subMesh.vertexData.vertexBufferBinding + + + vdecl.addElement(0, 0, Ogre.VertexElementType.VET_FLOAT3, Ogre.VertexElementSemantic.VES_POSITION) + vdecl.addElement(1, 0, Ogre.VertexElementType.VET_FLOAT3, Ogre.VertexElementSemantic.VES_NORMAL) + vdecl.addElement(2, 0, Ogre.VertexElementType.VET_FLOAT2, Ogre.VertexElementSemantic.VES_TEXTURE_COORDINATES) + + ## Prepare buffer for positions - todo: first attempt, slow + self.posVertexBuffer = \ + Ogre.HardwareBufferManager.getSingleton().createVertexBuffer( + 3 * ctypes.sizeof(ctypes.c_float), + self.numVertices, + Ogre.HardwareBuffer.HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE) + vbind.setBinding(0, self.posVertexBuffer) + + ## Prepare buffer for normals - write only + self.normVertexBuffer = \ + Ogre.HardwareBufferManager.getSingleton().createVertexBuffer( + 3*ctypes.sizeof(ctypes.c_float), + self.numVertices, + Ogre.HardwareBuffer.HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE) + vbind.setBinding(1, self.normVertexBuffer) + + ## Prepare texture coords buffer - static one + ## todo: optimize to write directly into buffer + storageclass = ctypes.c_float * (self.numVertices*2) + texcoordsBufData=storageclass(1.1) + + for y in range (complexity) : + for x in range(complexity) : + texcoordsBufData[2*(y*(complexity+1)+x)+0] = x / complexity + texcoordsBufData[2*(y*(complexity+1)+x)+1] = 1.0 - (y / (complexity)) + + + texcoordsVertexBuffer = \ + Ogre.HardwareBufferManager.getSingleton().createVertexBuffer( + 2*ctypes.sizeof(ctypes.c_float), + self.numVertices, + Ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY) + texcoordsVertexBuffer.writeData(0, + texcoordsVertexBuffer.getSizeInBytes(), + ctypes.addressof(texcoordsBufData), + True) ## true? + vbind.setBinding(2, texcoordsVertexBuffer) + + ## Prepare buffer for indices + self.indexBuffer = \ + Ogre.HardwareBufferManager.getSingleton().createIndexBuffer( + Ogre.HardwareIndexBuffer.IT_16BIT, + 3*self.numFaces, + Ogre.HardwareBuffer.HBU_STATIC, True) + + ## get the address of the self.indexBuffer + faceVertexIndices = self.indexBuffer.lock(0, self.numFaces*3*2, Ogre.HardwareBuffer.HBL_DISCARD) + faceVertexIndices = Ogre.CastInt ( faceVertexIndices ) + for y in range (complexity) : + for x in range (complexity ) : + twoface = faceVertexIndices + (y*complexity+x)*2*3 + p0 = y*(complexity+1) + x + p1 = y*(complexity+1) + x + 1 + p2 = (y+1)*(complexity+1) + x + p3 = (y+1)*(complexity+1) + x + 1 + ctypes.memset ( twoface + 0, p2, 1 ) + ctypes.memset ( twoface + 1, p1, 1 ) + ctypes.memset ( twoface + 2, p0, 1 ) + ctypes.memset ( twoface + 3, p2, 1 ) + ctypes.memset ( twoface + 4, p3, 1 ) + ctypes.memset ( twoface + 5, p1, 1 ) + self.indexBuffer.unlock() + ## Set index buffer for self submesh + subMesh.indexData.indexBuffer = self.indexBuffer + subMesh.indexData.indexStart = 0 + subMesh.indexData.indexCount = 3*self.numFaces + + # prepare vertex positions + # note - we use 3 vertex buffers, since algorighm uses two last phases + # to calculate the next one + storageclass2 = ctypes.c_float * (self.numVertices*3* 3 ) + self.vertexBuffers = storageclass2 (1.1) + + + ## Note that in the C++ code self.vertexBuffers is a float * array[3], whcih indexes into float*numverticies*3 + ## we have made a single array bige nough to cope + self.vertexIndexSize = self.numVertices*3 + + for b in range(3) : + for y in range(complexity) : + for x in range (complexity) : + numPoint = y*(complexity+1) + x +# # vertex = self.vertexBuffers[b] + 3.0*numPoint + VertexPos = (self.vertexIndexSize * b) + 3 * numPoint + self.vertexBuffers[VertexPos + 0] = x / (complexity * planeSize ) + self.vertexBuffers[VertexPos + 1] = 0 + self.vertexBuffers[VertexPos + 2] = y / (complexity * planeSize ) + + meshBounds = Ogre.AxisAlignedBox(0,0,0, planeSize,0, planeSize) + mesh._setBounds(meshBounds) + + self.currentBufNumber = 0 + self.posVertexBuffer.writeData(0, + self.posVertexBuffer.getSizeInBytes(), ## size + ctypes.addressof(self.vertexBuffers) + self.currentBufNumber*self.vertexIndexSize, ## source + True) ## discard? + + mesh.load() + mesh.touch() + + # ========================================================================= + def __del__ (self): + pass + + # =========================================================================== +# /** "pushes" a mesh at position [x,y]. Note, that x,y are float, hence +# * 4 vertices are actually pushed +# * @note +# * This should be replaced by push with 'radius' parameter to simulate +# * big objects falling into water +# */ + + def push( self, x, y, depth, absolute=False): + buf = self.vertexBuffers[self.currentBufNumber*self.vertexIndexSize]+1 + ## scale pressure according to time passed + depth = depth * self.lastFrameTime * ANIMATIONS_PER_SECOND + self._PREP(0,0) + self._PREP(0,1) + self._PREP(1,0) + self._PREP(1,1) + + def _PREP(self, addx,addy) : + return +# *vertex=buf+3*((int)(y+addy)*(complexity+1)+(int)(x+addx)) +# diffy = y - floor(y+addy) +# diffx = x - floor(x+addx) +# dist=sqrt(diffy*diffy + diffx*diffx) +# power = 1 - dist +# if (power<0): +# power = 0 +# if (absolute): +# *vertex = depth*power +# else: +# *vertex += depth*power + + def hat(self, _x,_y): + self.buf[3*(_y*(complexity+1)+(_x))] + + + # /* ========================================================================= */ + # gets height at given x and y, takes average value of the closes nodes */ + + def getHeight(self, x, y): + + self.buf = self.vertexBuffers[self.currentBufNumber*self.vertexIndexSize] + xa = floor(x) + xb = xa + 1 + ya = floor(y) + yb = ya + 1 + yaxavg = hat(xa,ya) * (1.0-fabs(xa-x)) + hat(xb,ya) * (1.0-fabs(xb-x)) + ybxavg = hat(xa,yb) * (1.0-fabs(xa-x)) + hat(xb,yb) * (1.0-fabs(xb-x)) + yavg = yaxavg * (1.0-fabs(ya-y)) + ybxavg * (1.0-fabs(yb-y)) + return yavg + +# /* ========================================================================= */ + def calculateFakeNormals(self): + return ## AJM + buf = self.currentBufNumber*self.vertexIndexSize + 1 + pNormals = self.normVertexBuffer.lock( + 0,self.normVertexBuffer.getSizeInBytes(), Ogre.HardwareBuffer.HBL_DISCARD) + for y in range (self.complexity) : +# # # nrow = pNormals + 3*y*(complexity+1) + row = buf + 3 * y * (self.complexity+1) + rowup = buf + 3*(y-1)*(self.complexity+1) + rowdown = buf + 3*(y+1)*(self.complexity+1) + for x in range (self.complexity) : + xdiff = row+ 3*x+3 - row +3*x-3 + ydiff = rowup + 3*x - rowdown+3*x-3 + norm = Ogre.Vector3(xdiff,30,ydiff) + norm.normalise() + buf.append( norm.x ) + buf.append( norm.y ) + buf.append( norm.z ) +# # # nrow[3*x+0] = norm.x +# # # nrow[3*x+1] = norm.y +# # # nrow[3*x+2] = norm.z + + Ogre.setUint16 ( pNormals, buf ) + self.normVertexBuffer.unlock() + +# /* ========================================================================= */ + def calculateNormals(self): + buf = self.vertexBuffers[self.currentBufNumber*self.vertexIndexSize] + 1 + ## zero normals + + for i in range(self.numVertices) : + self.vNormals.append( Ogre.Vector3().ZERO_Copy ) + return ## AJM + ## first, calculate normals for faces, add them to proper vertices + buf = self.vertexBuffers[self.currentBufNumber*self.vertexIndexSize] + vinds = self.indexBuffer.lock( + 0, self.indexBuffer.getSizeInBytes(), Ogre.HardwareBuffer.HBL_READ_ONLY) + pNormals = self.normVertexBuffer.lock( + 0, self.normVertexBuffer.getSizeInBytes(), Ogre.HardwareBuffer.HBL_DISCARD) + for i in range(self.numFaces) : + p0 = vinds[3*i] + p1 = vinds[3*i+1] + p2 = vinds[3*i+2] + v0=Ogre.Vector3 (buf[3*p0], buf[3*p0+1], buf[3*p0+2]) + v1 = Ogre.Vector3 (buf[3*p1], buf[3*p1+1], buf[3*p1+2]) + v3 = Ogre.Vector3 (buf[3*p2], buf[3*p2+1], buf[3*p2+2]) + diff1 = v2 - v1 + diff2 = v0 - v1 + fn = diff1.crossProduct(diff2) + self.vNormals[p0] += fn + self.vNormals[p1] += fn + self.vNormals[p2] += fn + + ## now normalize vertex normals + for y in (self.complexity) : + for x in (self.complexity) : + numPoint = y*(self.complexity+1) + x + n = self.vNormals[numPoint] + n.normalise() + normal = pNormals + 3*numPoint + normal[0]=n.x + normal[1]=n.y + normal[2]=n.z + + + self.indexBuffer.unlock() + self.normVertexBuffer.unlock() + +# /* ======================================================================== */ + def updateMesh(self, timeSinceLastFrame): + self.lastFrameTime = timeSinceLastFrame + self.lastTimeStamp += timeSinceLastFrame + + ## do rendering to get ANIMATIONS_PER_SECOND + while(self.lastAnimationTimeStamp <= self.lastTimeStamp): + + ## switch buffer numbers + self.currentBufNumber = (self.currentBufNumber + 1) % 3 + +# buf = self.vertexBuffers[self.currentBufNumber*self.vertexIndexSize] + 1 ## +1 for Y coordinate + + buf = self.currentBufNumber*self.vertexIndexSize + 1 + buf1 = (((self.currentBufNumber+2)%3) * self.vertexIndexSize) + 1 + buf2 = (((self.currentBufNumber+1)%3) * self.vertexIndexSize) + 1 + + # /* we use an algorithm from + # * http:##collective.valve-erc.com/index.php?go=water_simulation + # * The params could be dynamically changed every frame ofcourse + # */ + C = self.PARAM_C ## ripple speed + D = self.PARAM_D ## distance + U = self.PARAM_U ## viscosity + T = self.PARAM_T ## time + TERM1 = ( 4.0 - 8.0*C*C*T*T/(D*D) ) / (U*T+2) + TERM2 = ( U*T-2.0 ) / (U*T+2.0) + TERM3 = ( 2.0 * C*C*T*T/(D*D) ) / (U*T+2) + for y in range(self.complexity) : ## don't do anything with border values + row = buf + 3*y*(self.complexity+1) + row1 = buf1 + 3*y*(self.complexity+1) + row1up = buf1 + 3*(y-1)*(self.complexity+1) + row1down = buf1 + 3*(y+1)*(self.complexity+1) + row2 = buf2 + 3*y*(self.complexity+1) + for x in range (self.complexity) : + self.vertexBuffers[row+(3*x)] =\ + TERM1 * self.vertexBuffers[row1 + 3*x ] +\ + TERM2 * self.vertexBuffers[row2 + 3*x ] +\ + TERM3 * ( self.vertexBuffers[row1 + 3*x -3] +\ + self.vertexBuffers[row1 + 3*x +3] +\ + self.vertexBuffers[row1up + 3*x] +\ + self.vertexBuffers[row1down + 3*x] + ) + self.lastAnimationTimeStamp += (1.0 / ANIMATIONS_PER_SECOND) + + if (self.useFakeNormals): + self.calculateFakeNormals() + else : + self.calculateNormals() + + ## set vertex buffer + self.posVertexBuffer.writeData(0, + self.posVertexBuffer.getSizeInBytes(), ## size + ctypes.addressof (self.vertexBuffers) + self.currentBufNumber*self.vertexIndexSize, ## source + True) ## discard? + Modified: trunk/python-ogre/demos/plib/Demo_Client.py =================================================================== --- trunk/python-ogre/demos/plib/Demo_Client.py 2007-10-05 13:06:34 UTC (rev 410) +++ trunk/python-ogre/demos/plib/Demo_Client.py 2007-10-06 10:45:04 UTC (rev 411) @@ -2,20 +2,20 @@ import ctypes plib.netInit () + +sock = plib.netSocket () sock = plib.netSocket () -sock.open ( False ) +if not sock.open ( False ): + raise RuntimeError ("Unable to open a socket") sock.setBlocking ( False ) -sock.bind ( "127.0.0.1", 4444 ) +if sock.connect ( "127.0.0.1", 4444 ) == -1: + raise RuntimeError ("Unable to connect socket") + +count = 0 +print "Sending data." +while ( count < 10 ): + msg = "Hello :" + str ( count ) + ret = sock.send ( msg, 0 ) + count +=1 -maxlen = 8096 -storageclass = ctypes.c_char * (maxlen) -buffer_in=storageclass(" ") -ctypes.memset ( buffer_in, 0, maxlen ) # just showing how this can be done - - -while ( 1 ): - buffer_in = sock.recv( maxlen, 0 ) - if len(buffer_in) >= 0 : - print "Data in ("+str(len(buffer_in))+"):"+ buffer_in - sock.close () Modified: trunk/python-ogre/demos/plib/Demo_Server.py =================================================================== --- trunk/python-ogre/demos/plib/Demo_Server.py 2007-10-05 13:06:34 UTC (rev 410) +++ trunk/python-ogre/demos/plib/Demo_Server.py 2007-10-06 10:45:04 UTC (rev 411) @@ -1,26 +1,19 @@ import ogre.addons.plib as plib -import ctypes plib.netInit () - -sock = plib.netSocket () -sock.open ( False ) +sock = plib.netSocket () +if not sock.open ( False ): + raise RuntimeError ("Unable to open a socket") sock.setBlocking ( False ) -sock.connect ( "127.0.0.1", 4444 ) +if sock.bind ( "127.0.0.1", 4444 ) == -1: + raise RuntimeError ("Unable to bind socket") +print "Waiting to receive data." +while ( True ): + # use recv to recive the input data as a list of invidual bytes -- suitable for binary data etc + # use recv_str to receive the input data as a string + # specify maxlen if you need to receive greater than 2048 ie recv(4096) + buffer_in = sock.recv_str( ) + if len(buffer_in) >0 : + print "Received:", buffer_in -count = 0 -maxlen = 256 -storageclass = ctypes.c_char * (maxlen) -buffer_out=storageclass(" ") -ctypes.memset ( buffer_out, 39, maxlen ) # just showing how this can be done - - -while ( count < 10 ): - msg = "Hello :" + str ( count ) - print msg - buffer_out[:len(msg)] = msg - ret = sock.send ( ctypes.addressof(buffer_out), len(msg), 0 ) - print ret - count +=1 - sock.close () Modified: trunk/python-ogre/demos/qgui/Demo_QuickGUI01.py =================================================================== --- trunk/python-ogre/demos/qgui/Demo_QuickGUI01.py 2007-10-05 13:06:34 UTC (rev 410) +++ trunk/python-ogre/demos/qgui/Demo_QuickGUI01.py 2007-10-06 10:45:04 UTC (rev 411) @@ -65,13 +65,13 @@ if( self.mGUIManager != None ) : self.mGUIManager .injectTime(evt.timeSinceLastFrame) - if(self.mouseOverTB != None): - self.mouseOverTB.setText(self.mGUIManager.getMouseOverWidget().getInstanceName()) - - if(self.debugTB == None): - self.debugTB = self.mGUIManager.getActiveSheet().getTextBox("DebugTextBox") - else: - self.debugTB.setText(self.mGUIManager.getDebugString()) +# if(self.mouseOverTB != None): +# self.mouseOverTB.setText(self.mGUIManager.getMouseOverWidget().getInstanceName()) +# +# if(self.debugTB == None): +# self.debugTB = self.mGUIManager.getActiveSheet().getTextBox("DebugTextBox") +# else: +# self.debugTB.setText(self.mGUIManager.getDebugString()) return sf.FrameListener.frameStarted(self,evt) @@ -214,7 +214,8 @@ self.mSheet.setDefaultFont ("acmesa.12") ## Main Menu and it's MenuLists - topMenu = self.mSheet.createMenu(Rect(0,0,800,25)) + topMenu = self.mSheet.createMenu() + topMenu.setDimensions(Rect(0,0,800,25)) fileList = topMenu.addMenuList("File",0,60) exitListItem = fileList.addListItem("Exit") @@ -261,19 +262,29 @@ toggleRenderStats.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.evtHndlr_toggleDebugDisplay)) ## Logos - logoImage = self.mSheet.createImage(Rect(16,42,240,180)) - logoLabel = self.mSheet.createLabel(Rect(60,240,120,30)) + logoImage = self.mSheet.createImage() + logoImage.setDimensions(Rect(16,42,240,180)) + + logoLabel = self.mSheet.createLabel() + logoLabel.setDimensions(Rect(60,240,120,30)) logoLabel.getText().setCaption("Click Me >") - self.imageToggleButton = self.mSheet.createNStateButton("HotDang",Rect(180,240,40,30)) + self.imageToggleButton = self.mSheet.createNStateButton() + self.imageToggleButton.setDimensions(Rect(180,240,40,30)) self.imageToggleButton.addState("OgreLogo","qgui.checked.png") self.imageToggleButton.addState("SimpleGUILogo","qgui.unchecked.png") ## RTT Example Use - rttImage = self.mSheet.createImage(Rect(600,42,160,90),"self.rttTex") + rttImage = self.mSheet.createImage() + rttImage.setDimensions(Rect(600,42,160,90)) + rttImage.setTexture("RttTex") # rttImage.setBorderWidth(10) - ninjaWindow = self.mSheet.createWindow(Rect(600,150,160,120)) + + ninjaWindow = self.mSheet.createWindow() ninjaWindow.hideTitlebar() - animToggleButton = ninjaWindow.createNStateButton(Rect(8,7.5,144,30)) + ninjaWindow.setDimensions(Rect(600,150,160,120)) + + animToggleButton = ninjaWindow.createNStateButton() + animToggleButton.setDimensions(Rect(8,7.5,144,30)) ## populate NStateButton with States - robot animations casi = self.robot.getAllAnimationStates().getAnimationStateIterator() state = 0 @@ -290,62 +301,94 @@ # animToggleButton.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.evtHndlr_changeAnimations) ) animToggleButton.addOnStateChangedEventHandler(self.MakeCallback(self.evtHndlr_changeAnimations) ) - hurtButton = ninjaWindow.createButton(Rect(8,45,144,30)) + hurtButton = ninjaWindow.createButton() + hurtButton.setDimensions(Rect(8,45,144,30)) hurtButton.getText().setCaption("Hurt") hurtButton.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.evtHndlr_hurt) ) - healButton = ninjaWindow.createButton(Rect(8,82.5,144,30)) + + healButton = ninjaWindow.createButton() + healButton.setDimensions(Rect(8,82.5,144,30)) healButton.getText().setCaption("Heal") healButton.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.evtHndlr_heal) ) ## TrackBar Setup - tb1 = self.mSheet.createHorizontalTrackBar(Rect(320,60,160,24)) + tb1 = self.mSheet.createHorizontalTrackBar() + tb1.setDimensions(Rect(320,60,160,24)) tb1.setNumRegions(3) - #tb1.setTickPosition(4) # Does not work! 3 regions -> ticks: 0/1/2/3 - tb2 = self.mSheet.createVerticalTrackBar(Rect(320,90,24,120)) + #tb1.setTickPosition(4) # Does not work! 3 regions . ticks: 0/1/2/3 + tb2 = self.mSheet.createVerticalTrackBar() + tb2.setDimensions(Rect(320,90,24,120)) tb2.setNumTicks(10) #tb2.setTickPosition(9) ## Progress Bar Setup - self.lifeBar = self.mSheet.createProgressBar(Rect(320,330,160,18)) + self.lifeBar = self.mSheet.createProgressBar() + self.lifeBar.setDimensions(Rect(320,330,160,18)) self.lifeBar.setInitialPixelOffset(0) - HPLabel = self.mSheet.createLabel(Rect(320,315,56,42),"") + HPLabel = self.mSheet.createLabel() + HPLabel.setDimensions(Rect(320,315,56,42)) + HPLabel.setTexture("") HPLabel.getText().setCaption("HP") HPLabel.appearOverWidget(self.lifeBar) - self.lifeBarValueLabel = self.mSheet.createLabel(Rect(440,315,56,42),"") + + self.lifeBarValueLabel = self.mSheet.createLabel() + self.lifeBarValueLabel.setDimensions(Rect(440,315,56,42)) + self.lifeBarValueLabel.setTexture("") self.lifeBarValueLabel.getText().setCaption("100") self.lifeBarValueLabel.appearOverWidget(self.lifeBar) ## Mouse Over window - mouseOverWindow = self.mSheet.createWindow("Mouse Over Window",Rect(480,420,320,60)) + mouseOverWindow = self.mSheet.createWindow() + mouseOverWindow.setDimensions(Rect(480,420,320,60)) mouseOverWindow.hideTitlebar() - mouseOverLabel = mouseOverWindow.createLabel(Rect(0,0,320,30)) + + mouseOverLabel = mouseOverWindow.createLabel() + mouseOverLabel.setDimensions(Rect(0,0,320,30)) mouseOverLabel.getText().setCaption("Mouse Over Widget:") s = mouseOverLabel.getSize() - self.mouseOverTB = mouseOverWindow.createTextBox(Rect(0,s.height,320,30)) + self.mouseOverTB = mouseOverWindow.createTextBox() + self.mouseOverTB.setDimensions(Rect(0,s.height,320,30)) self.mouseOverTB.setReadOnly(True) ## Login Portion - self.mSheet.createLabel(Rect(16,360,160,30)).getText().setCaption("User Name:") - self.mSheet.createLabel(Rect(16,390,160,30)).getText().setCaption("Password:") - self.usernameTB = self.mSheet.createTextBox(Rect(180,360,200,30)) + l=self.mSheet.createLabel() + l.setDimensions(Rect(16,360,160,30)) + l.getText().setCaption("User Name:") + + l=self.mSheet.createLabel() + l.setDimensions(Rect(16,390,160,30)) + l.getText().setCaption("Password:") + + self.usernameTB = self.mSheet.createTextBox() + self.usernameTB.setDimensions(Rect(180,360,200,30)) self.usernameTB.setText("\tThe quick brown fox jumped over the red fence.") - self.passwordTB = self.mSheet.createTextBox(Rect(180,390,200,30)) + self.passwordTB = self.mSheet.createTextBox() + self.passwordTB.setDimensions(Rect(180,390,200,30)) self.passwordTB.maskUserInput(ord('*')) - loginButton = self.mSheet.createButton(Rect(100,420,200,42)) + + loginButton = self.mSheet.createButton() + loginButton.setDimensions(Rect(100,420,200,42)) loginButton.getText().setCaption("Login") loginButton.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.evtHndlr_login) ) - self.loginResultLabel = self.mSheet.createLabel(Rect(0.0,462,480,30), "") - + self.loginResultLabel = self.mSheet.createLabel() + self.loginResultLabel.setDimensions(Rect(0.0,462,480,30)) + self.loginResultLabel.setTexture("") + ## Set Text Window - self.stWindow = self.mSheet.createWindow(Rect(560,270,240,120)) + self.stWindow = self.mSheet.createWindow() + self.stWindow.setDimensions(Rect(560,270,240,120)) self.stWindow.hide() self.stWindow.getTitleBar().setCaption("Set Text Color:") closeButton = self.stWindow.getTitleBar().getCloseButton() - self.stWindow.createLabel(Rect(40,30,60,30)).getText().setCaption("Color:") - colorCB = self.stWindow.createComboBox(Rect(125,30,100,30)) + l=self.stWindow.createLabel() + l.setDimensions(Rect(40,30,60,30)) + l.getText().setCaption("Color:") + + colorCB = self.stWindow.createComboBox() + colorCB.setDimensions(Rect(125,30,100,30)) colorCBdropList = colorCB.getDropDownList() colorCBdropList.setNumberOfVisibleItems(6) @@ -357,21 +400,26 @@ colorCBdropList.addListItem("Yellow") colorCBdropList.addListItem("Purple") colorCBdropList.addListItem("Brown") - setTextButton = self.stWindow.createButton(Rect(80,70,50,30)) + + setTextButton = self.stWindow.createButton() + setTextButton.setDimensions(Rect(80,70,50,30)) setTextButton.setCaption("Apply") setTextButton.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.evtHndlr_setTextColor) ) - # colorCB->clearList(); + # colorCB.clearList() # colorCBdropList.removeListItem(2) - testButton = self.mSheet.createButton("TestButton1",Rect(1200,800,100,50)) + testButton = self.mSheet.createButton() + testButton.setDimensions(Rect(1200,800,100,50)) testButton.getText().setCaption("TEST") testButton.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.test)) - testButton2 = self.stWindow.createButton("TestButton2",Rect(500,190,100,50)) + testButton2 = self.stWindow.createButton() + testButton2.setDimensions(Rect(500,190,100,50)) testButton2.getText().setCaption("TEST") testButton2.addEventHandler(gui.Widget.EVENT_MOUSE_BUTTON_UP,self.MakeCallback(self.test)) - self.mSheet.createTextBox("DebugTextBox",Rect(480,480,320,30)) + tb=self.mSheet.createTextBox() + tb.setDimensions(Rect(480,480,320,30)) def test(self, args): Modified: trunk/python-ogre/environment.py =================================================================== --- trunk/python-ogre/environment.py 2007-10-05 13:06:34 UTC (rev 410) +++ trunk/python-ogre/environment.py 2007-10-06 10:45:04 UTC (rev 411) @@ -329,8 +329,22 @@ CheckIncludes = ['boost/python.hpp', 'Opcode.h'] active=True +class caelum: + version="0.2.1" + parent="ogre/addons" + cflags = "" + include_dirs = [ Config.PATH_Boost, + Config.PATH_INCLUDE_Ogre, + Config.PATH_caelum + ] + lib_dirs = [Config.PATH_LIB_Boost, + Config.PATH_LIB_Ogre_OgreMain + ] + CheckIncludes=[] + libs=[ Config.LIB_Boost, 'OgreMain' ] + ModuleName="caelum" + active=True - class newton: version= "1.0" active=False @@ -385,7 +399,7 @@ ] CheckIncludes=[] libs=[ Config.LIB_Boost, 'OgreMain' ] - ModuleName="quickgui" + ModuleName="QuickGUI" active=True class navi: @@ -562,11 +576,17 @@ if os.name =='nt': CCFLAGS = ' -DOgreAL_Export="" -DWIN32 -DNDEBUG -D_LIB -D_WIN32 -D_WINDOWS -DVORBIS_IEEE_FLOAT32 -D_USE_NON_INTEL_COMPILER ' - libs=[Config.LIB_Boost, 'OgreMain', - 'ogg_static', - 'alut', - 'vorbis_static','vorbisfile_static','vorbisenc_static', - 'OpenAL32', 'EFX-Util'] ## 'OgreAL' -- going to compile OgreAL ourselves + libs=[Config.LIB_Boost, 'OgreMain', + 'ogg_static', + 'alut', + 'vorbis_static','vorbisfile_static','vorbisenc_static', + 'OpenAL32', 'EFX-Util'] ## 'OgreAL' -- going to compile OgreAL ourselves + else: + libs=[Config.LIB_Boost, 'OgreMain', + 'ogg', + 'alut', + 'vorbis','vorbisfile','vorbisenc', + 'openal'] ## 'OgreAL' -- going to compile OgreAL ourselves ModuleName = 'OgreAL' CheckIncludes = ['OgreAL.h'] active=True @@ -730,6 +750,7 @@ , 'ogrebulletd' : ogrebulletd , 'ogreforests' : ogreforests , 'et' : et + , 'caelum' : caelum } # This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2007-10-05 13:07:51
|
Revision: 410 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=410&view=rev Author: andy_miller Date: 2007-10-05 06:06:34 -0700 (Fri, 05 Oct 2007) Log Message: ----------- Added support for Caelum (Thanks again to Dermont) a cool sky system... Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_nt.py trunk/python-ogre/PythonOgreConfig_posix.py trunk/python-ogre/SConstruct trunk/python-ogre/setup.py Added Paths: ----------- trunk/python-ogre/ThirdParty/caelum/ trunk/python-ogre/ThirdParty/caelum/Caelum.h trunk/python-ogre/ThirdParty/caelum/CaelumExceptions.h trunk/python-ogre/ThirdParty/caelum/CaelumListener.h trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.cpp trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.h trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h trunk/python-ogre/ThirdParty/caelum/CameraBoundElement.h trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.cpp trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.h trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.cpp trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.h trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp trunk/python-ogre/ThirdParty/caelum/SkyDome.h trunk/python-ogre/ThirdParty/caelum/Starfield.cpp trunk/python-ogre/ThirdParty/caelum/Starfield.h trunk/python-ogre/ThirdParty/caelum/StoredImageElvBasedSkyColourModel.cpp trunk/python-ogre/ThirdParty/caelum/StoredImageElvBasedSkyColourModel.h trunk/python-ogre/ThirdParty/caelum/StoredImageSkyColourModel.cpp trunk/python-ogre/ThirdParty/caelum/StoredImageSkyColourModel.h trunk/python-ogre/ThirdParty/caelum/Sun.cpp trunk/python-ogre/ThirdParty/caelum/Sun.h trunk/python-ogre/ThirdParty/caelum/SunPositionModel.h trunk/python-ogre/ThirdParty/caelum/UniversalClock.cpp trunk/python-ogre/ThirdParty/caelum/UniversalClock.h trunk/python-ogre/code_generators/caelum/ trunk/python-ogre/code_generators/caelum/customization_data.py trunk/python-ogre/code_generators/caelum/generate_code.py trunk/python-ogre/code_generators/caelum/generate_code.py.org trunk/python-ogre/code_generators/caelum/hand_made_wrappers.py trunk/python-ogre/code_generators/caelum/python_caelum.h trunk/python-ogre/code_generators/caelum/python_caelum_aliases.h trunk/python-ogre/code_generators/caelum/python_caelum_sizeof.h trunk/python-ogre/demos/caelum/ trunk/python-ogre/demos/caelum/Demo_Caelum01.py trunk/python-ogre/demos/caelum/SampleFramework.py trunk/python-ogre/demos/caelum/media/ trunk/python-ogre/demos/caelum/media/AltocumulusDetail.png trunk/python-ogre/demos/caelum/media/AltostratusDetail.png trunk/python-ogre/demos/caelum/media/AtmosphereDepth.png trunk/python-ogre/demos/caelum/media/CaelumShaders.cg trunk/python-ogre/demos/caelum/media/CirrostratusDetail.png trunk/python-ogre/demos/caelum/media/CirrusDetail.png trunk/python-ogre/demos/caelum/media/CloudLayer.png trunk/python-ogre/demos/caelum/media/CloudNoise1.png trunk/python-ogre/demos/caelum/media/EarthClearSky.png trunk/python-ogre/demos/caelum/media/EarthClearSky2.png trunk/python-ogre/demos/caelum/media/EarthClearSkyFog.png trunk/python-ogre/demos/caelum/media/LayeredCloud.cg trunk/python-ogre/demos/caelum/media/LayeredClouds.material trunk/python-ogre/demos/caelum/media/SkyLightAbsorption.cg trunk/python-ogre/demos/caelum/media/Starfield.jpg trunk/python-ogre/demos/caelum/media/Terrain.cfg trunk/python-ogre/demos/caelum/media/Terrain.material trunk/python-ogre/demos/caelum/media/noise1.png trunk/python-ogre/demos/caelum/media/noise2.png trunk/python-ogre/demos/caelum/media/noise3.png trunk/python-ogre/demos/caelum/media/noise4.png trunk/python-ogre/demos/caelum/plugins.cfg trunk/python-ogre/demos/caelum/resources.cfg trunk/python-ogre/packages_2.5/ogre/addons/caelum/ trunk/python-ogre/packages_2.5/ogre/addons/caelum/__init__.py Modified: trunk/python-ogre/PythonOgreConfig_nt.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-05 08:20:21 UTC (rev 409) +++ trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-05 13:06:34 UTC (rev 410) @@ -42,6 +42,8 @@ PATH_ogredshow = os.path.join(PATH_THIRDPARTY,'dshow') PATH_plib = os.path.join(PATH_THIRDPARTY, 'plib') PATH_et = os.path.join(PATH_THIRDPARTY, 'et') +PATH_caelum = os.path.join(PATH_THIRDPARTY, 'caelum') + PATH_ogrevideoffmpeg = os.path.join(PATH_THIRDPARTY,'ffmpeg') PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.62') Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-05 08:20:21 UTC (rev 409) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-05 13:06:34 UTC (rev 410) @@ -49,6 +49,7 @@ PATH_ogredshow = os.path.join(PATH_THIRDPARTY,'dshow') PATH_plib = os.path.join(PATH_THIRDPARTY, 'plib') PATH_et = os.path.join(PATH_THIRDPARTY, 'et') +PATH_caelum = os.path.join(PATH_THIRDPARTY, 'caelum') PATH_ogrevideoffmpeg = os.path.join(PATH_THIRDPARTY,'ffmpeg') PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') Modified: trunk/python-ogre/SConstruct =================================================================== --- trunk/python-ogre/SConstruct 2007-10-05 08:20:21 UTC (rev 409) +++ trunk/python-ogre/SConstruct 2007-10-05 13:06:34 UTC (rev 410) @@ -91,11 +91,11 @@ possible_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ 'ogreode', 'ogreal', 'quickgui', 'opcode', 'nxogre', 'bullet', 'physx', 'betagui','theora',\ 'ogrevideoffmpeg', 'ogredshow', 'plib', 'ogrebulletc', 'ogrebulletd', - 'ogreforests', 'et', 'navi' ] # , 'raknet' + 'ogreforests', 'et', 'navi', 'caelum' ] # , 'raknet' default_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ 'ogreode', 'ogreal', 'quickgui', 'opcode', 'nxogre', 'bullet', 'physx', 'betagui','theora',\ 'ogrevideoffmpeg', 'ogredshow', 'plib', 'ogrebulletc', 'ogrebulletd', - 'ogreforests', 'et'] # 'navi', + 'ogreforests', 'et', 'caelum' ] # 'navi', # This lets you call scons like: 'scons PROJECTS=ogre,cegui' opts = Options('custom.py') Added: trunk/python-ogre/ThirdParty/caelum/Caelum.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/Caelum.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/Caelum.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,21 @@ +#ifndef CAELUM_H +#define CAELUM_H + +#include "CaelumPrerequisites.h" + +#include "CaelumExceptions.h" +#include "CaelumListener.h" +#include "CaelumSystem.h" +#include "CameraBoundElement.h" +#include "EarthSunPositionModel.h" +#include "GeometryFactory.h" +#include "SimpleSunPositionModel.h" +#include "SkyColourModel.h" +#include "SkyDome.h" +#include "StoredImageSkyColourModel.h" +#include "StoredImageElvBasedSkyColourModel.h" +#include "Sun.h" +#include "SunPositionModel.h" +#include "UniversalClock.h" + +#endif //CAELUM_H Added: trunk/python-ogre/ThirdParty/caelum/CaelumExceptions.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumExceptions.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CaelumExceptions.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,21 @@ +#ifndef CAELUMEXCEPTIONS_H +#define CAELUMEXCEPTIONS_H + +#include "CaelumPrerequisites.h" + +namespace caelum { + +/** Exception class for unsupported features. + * @author Jesús Alonso Abad. + */ +class DllExport UnsupportedException : public Ogre::Exception { + public: + /** Constructor. + */ + UnsupportedException (int number, const Ogre::String &description, const Ogre::String &source, const char *file, long line) + : Ogre::Exception (number, description, source, "UnsupportedException", file, line) { } +}; + +} // namespace caelum + +#endif // CAELUMEXCEPTIONS_H Added: trunk/python-ogre/ThirdParty/caelum/CaelumListener.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumListener.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CaelumListener.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,50 @@ +#ifndef CAELUMLISTENER_H +#define CAELUMLISTENER_H + +#include "CaelumPrerequisites.h" + +namespace caelum { + +// Predefinition of the system for the crossed reference. +class CaelumSystem; + +/** The Caelum listener interface. + Allows to register its subclasses to Caelum so that it receives notifications each frame + before it's started or finished. Useful, for instance, to prototype certain functionality + like passing the sun direction to a shader/material that isn't defined inside Caelum + itself. + @author Jesús Alonso Abad + @version 1.0 + */ +class DllExport CaelumListener { +// Methods -------------------------------------------------------------------- + public: + /** Destructor. + */ + virtual ~CaelumListener () {}; + /** Trigger fired just before Caelum is about to do its work. + @param e The Ogre FrameEvent object, in case it's desired to use this as a + FrameListener as well. + @param caelumSystem A reference to the invoker (the Caelum system) itself in case some + operations on it are wanted to be done. + @return True if it's desired to continue running Caelum. + */ + virtual bool caelumStarted (const Ogre::FrameEvent &e, CaelumSystem *caelumSystem) { + return true; + } + + /** Trigger fired just after Caelum is about to do its work. + @param e The Ogre FrameEvent object, in case it's desired to use this as a + FrameListener as well. + @param caelumSystem A reference to the invoker (the Caelum system) itself in case some + operations on it are wanted to be done. + @return True if it's desired to continue running after Caelum finished. + */ + virtual bool caelumFinished (const Ogre::FrameEvent &e, CaelumSystem *caelumSystem) { + return true; + } +}; + +} // namespace caelum + +#endif //CAELUMLISTENER_H Added: trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.cpp 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1 @@ +#include "CaelumPrecompiled.h" Added: trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CaelumPrecompiled.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1 @@ +#include "Ogre.h" Added: trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CaelumPrerequisites.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,37 @@ +#ifndef CAELUMPREREQUISITES_H +#define CAELUMPREREQUISITES_H + +// Include external headers +#include "Ogre.h" + +// Define the dll export qualifier if compiling for Windows +// // #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 +// // #ifdef CAELUM_LIB +// // #define DllExport __declspec (dllexport) +// // #else +// // #ifdef __MINGW32__ +// // #define DllExport +// // #else +// // #define DllExport __declspec (dllimport) +// // #endif +// // #endif +// // #else + #define DllExport +// // #endif + +// Define the version code +#define CAELUM_VERSION_MAIN 0 +#define CAELUM_VERSION_SEC 2 +#define CAELUM_VERSION_TER 1 +#define CAELUM_VERSION = (CAELUM_VERSION_MAIN << 16) | (CAELUM_VERSION_SEC << 8) | CAELUM_VERSION_TER + +/* Set a global camera distances modifier for the clipping distance. + This threshold will be substracted from the far clipping distance if applicable, else it will be + added to the near clipping distance (ie, if infinite far clipping distance is used). + */ +#define CAMERA_DISTANCE_MODIFIER 0.1 + +// Log macro +#define LOG(msg) Ogre::LogManager::getSingleton().logMessage(msg); + +#endif //CAELUMPREREQUISITES_H Added: trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CaelumSystem.cpp 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,292 @@ +#include "CaelumPrecompiled.h" +#include "CaelumSystem.h" + +namespace caelum { + +Ogre::String CaelumSystem::RESOURCE_GROUP_NAME = "Caelum"; + +CaelumSystem::CaelumSystem (Ogre::Root *root, + Ogre::SceneManager *sceneMgr, + bool manageResGroup, + const Ogre::String &resGroupName, + bool createSkyDome, bool createSun, bool createStarfield) { + LOG ("Initialising Caelum system..."); + mOgreRoot = root; + mSceneMgr = sceneMgr; + + mCleanup = false; + + RESOURCE_GROUP_NAME = resGroupName; + + // Create resource group + if (manageResGroup) { + // Search for the resource group + Ogre::StringVector resGroups = Ogre::ResourceGroupManager::getSingleton ().getResourceGroups (); + Ogre::StringVector::iterator it = resGroups.begin (), iend = resGroups.end (); + while (it != iend && *it != resGroupName) + ++it; + + if (it == iend) { + Ogre::ResourceGroupManager::getSingleton ().createResourceGroup (RESOURCE_GROUP_NAME); + mManageResourceGroup = true; + LOG (Ogre::String ("Created Caelum resource group (") + RESOURCE_GROUP_NAME + ")"); + } + else { + mManageResourceGroup = false; + } + } + else { + mManageResourceGroup = false; + } + + // Clock + mUniversalClock = new UniversalClock (); + + // Set-up attributes + mManageFog = false; + + mSkyDome = 0; + mSun = 0; + mStarfield = 0; + LOG ("System attributes set up."); + + // Create basic elements + if (createSkyDome) + this->createSkyDome (); + if (createSun) + this->createSun (); + if (createStarfield) + this->createStarfield (); + + // Auto-register itself as a frame listener + mOgreRoot->addFrameListener (this); + + LOG ("DONE"); +} + +CaelumSystem::~CaelumSystem () { + LOG ("Caelum system destroyed."); +} + +void CaelumSystem::shutdown (const bool cleanup) { + LOG ("Shutting down Caelum system..."); + // Remove itself as a frame listener + mOgreRoot->removeFrameListener (this); + + // Unregister all the caelum listeners + mListeners.clear (); + + // Destroy the elements + destroySkyDome (); + destroySun (); + destroyStarfield (); + + // Destroy the clock + if (mUniversalClock) { + delete mUniversalClock; + mUniversalClock = 0; + } + + // Remove resource group + if (mManageResourceGroup) { + Ogre::ResourceGroupManager::getSingleton ().destroyResourceGroup (RESOURCE_GROUP_NAME); + LOG ("Destroyed Caelum resource group"); + } + + if (cleanup) + delete this; + else + mCleanup = true; +} + +void CaelumSystem::addListener (CaelumListener *listener) { + mListeners.insert (listener); +} + +void CaelumSystem::removeListener (CaelumListener *listener) { + mListeners.erase (listener); +} + +void CaelumSystem::preViewportUpdate (const Ogre::RenderTargetViewportEvent &e) { + Ogre::Camera *cam = e.source->getCamera (); + + if (mSkyDome) { + mSkyDome->notifyCameraChanged (cam); + } + + if (mSun) { + mSun->notifyCameraChanged (cam); + } + + if (mStarfield) { + mStarfield->notifyCameraChanged (cam); + } +} + +UniversalClock *CaelumSystem::getUniversalClock () const { + return mUniversalClock; +} + +bool CaelumSystem::frameStarted (const Ogre::FrameEvent &e) { + // First of all, check if a cleanup has been requested or not, and if so, self-destruction + if (mCleanup) { + delete this; + return true; + } + + if (mUniversalClock->update (e.timeSinceLastFrame)) { + // Call every listener before doing anything + if (!fireStartedEvent (e)) + return false; + + if (mSun) { + mSun->update (mUniversalClock->getCurrentRelativeDayTime ()); + } + + if (mStarfield) { + mStarfield->update (mUniversalClock->getCurrentRelativeDayTime ()); + } + + if (mSkyDome) { + mSkyDome->updateSkyDomeMaterialTime (mSkyColourModel, mUniversalClock->getCurrentRelativeDayTime (), mSun); + + mSkyDome->setSunDirection (mSun->getSunDirection ()); + } + + if (mManageFog) { + // TODO: Fog stuff here!!! + if (mSkyColourModel) { + mSceneMgr->setFog (Ogre::FOG_EXP2, + mSkyColourModel->getFogColour (mUniversalClock->getCurrentRelativeDayTime (), mSun ? mSun->getSunDirection() : Ogre::Vector3::UNIT_Y) * 0.7, + mSkyColourModel->getFogDensity (mUniversalClock->getCurrentRelativeDayTime (), mSun ? mSun->getSunDirection() : Ogre::Vector3::UNIT_Y)); + } + } + + if (mSun) { + if (mSkyColourModel) + mSun->setSunColour (mSkyColourModel->getSunColour (mUniversalClock->getCurrentRelativeDayTime (), mSun->getSunDirection ())); + else + mSun->setSunColour (mSceneMgr->getFogColour ()); + } + + // Call every listener before quiting + if (!fireFinishedEvent (e)) + return false; + } + + return true; +} + +SkyDome *CaelumSystem::createSkyDome () { + if (!mSkyDome) { + mSkyDome = new SkyDome (mSceneMgr); + LOG ("Sky Dome created."); + } + + return mSkyDome; +} + +SkyDome *CaelumSystem::getSkyDome () const { + return mSkyDome; +} + +void CaelumSystem::destroySkyDome () { + if (mSkyDome) { + delete mSkyDome; + mSkyDome = 0; + LOG ("Sky Dome destroyed."); + } +} + +Sun *CaelumSystem::createSun () { + if (!mSun) { + mSun = new Sun (mSceneMgr); + LOG ("Sun created."); + } + + return mSun; +} + +Sun *CaelumSystem::getSun () const { + return mSun; +} + +void CaelumSystem::destroySun () { + if (mSun) { + delete mSun; + mSun = 0; + LOG ("Sun destroyed."); + } +} + +Starfield *CaelumSystem::createStarfield (const Ogre::String &mapName) { + if (!mStarfield) { + mStarfield = new Starfield (mSceneMgr); + LOG ("Starfield created."); + } + + mStarfield->updateMaterial (mapName); + + return mStarfield; +} + +Starfield *CaelumSystem::getStarfield () const { + return mStarfield; +} + +void CaelumSystem::destroyStarfield () { + if (mStarfield) { + delete mStarfield; + mStarfield = 0; + LOG ("Starfield destroyed."); + } +} + +void CaelumSystem::setSkyColourModel (SkyColourModel *model) { + mSkyColourModel = model; + if (mSkyDome) { + Ogre::TextureUnitState *temp = mSkyDome->getTextureUnitState (); + if (temp) + mSkyColourModel->setSkyGradientsTextureUnitState (temp); + } +} + +void CaelumSystem::setManageFog (bool manage) { + mManageFog = manage; +} + +bool CaelumSystem::isFogManaged () const { + return mManageFog; +} + +bool CaelumSystem::fireStartedEvent (const Ogre::FrameEvent &e) { + std::set<CaelumListener *>::iterator it, iend = mListeners.end (); + bool flag = true; + + it = mListeners.begin (); + + while (it != iend && flag) { + flag &= (*it)->caelumStarted (e, this); + + ++it; + } + + return flag; +} + +bool CaelumSystem::fireFinishedEvent (const Ogre::FrameEvent &e) { + std::set<CaelumListener *>::iterator it, iend = mListeners.end (); + bool flag = true; + + it = mListeners.begin (); + + while (it != iend && flag) { + flag &= (*it)->caelumFinished (e, this); + + ++it; + } + + return flag; +} + +} // namespace caelum Added: trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CaelumSystem.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,205 @@ +#ifndef CAELUMSYSTEM_H +#define CAELUMSYSTEM_H + +#include "CaelumPrerequisites.h" + +#include "UniversalClock.h" +#include "CaelumListener.h" +#include "SkyColourModel.h" +#include "SkyDome.h" +#include "Starfield.h" +#include "Sun.h" + +namespace caelum { + +/** Root of the Caelum system. + This class is the root of the Caelum system. + @author Jes\xFAs Alonso Abad + */ +class DllExport CaelumSystem : public Ogre::FrameListener, public Ogre::RenderTargetListener { +// Attributes ----------------------------------------------------------------- + public: + /** Common resource group name. + */ + static Ogre::String RESOURCE_GROUP_NAME; + + private: + /** Root of the Ogre engine. + */ + Ogre::Root *mOgreRoot; + + /** Scene manager. + */ + Ogre::SceneManager *mSceneMgr; + + /** Cleanup requested flag. + */ + bool mCleanup; + + /** Flag to let Caelum manage the creation and destruction of the resource group. + */ + bool mManageResourceGroup; + + /** List of listeners registered. + */ + std::set<CaelumListener *> mListeners; + + /// Reference to the universal clock. + UniversalClock *mUniversalClock; + + /** The sky dome. + */ + SkyDome *mSkyDome; + + /** Reference to the sky colour model in use. + */ + SkyColourModel *mSkyColourModel; + + /** Flag to indicate if Caelum should manage the fog or not. + */ + bool mManageFog; + + /** Reference to the sun. + */ + Sun *mSun; + + /** Reference to the starfield. + */ + Starfield *mStarfield; + +// Methods -------------------------------------------------------------------- + public: + /** Constructor. + Registers itself in the Ogre engine and initialises the system. + @param root The Ogre rool. + @param sceneMgr The Ogre scene manager. + @param manageResGroup Tells the system if the resource group has been created externally (true) or if it's to be managed by the system. + @param resGroupName The resource group name, if it's desired to use an existing one or just a different name. + @param createSkyDome Whether if the sky dome should be created or not. + @param createSun Whether if the sun should be created or not. + @param createStarfield Whether if the starfield should be created or not. + */ + CaelumSystem (Ogre::Root *root, + Ogre::SceneManager *sceneMgr, + bool manageResGroup = true, + const Ogre::String &resGroupName = RESOURCE_GROUP_NAME, + bool createSkyDome = true, bool createSun = true, bool createStarfield = true); + + /** Destructor. + */ + ~CaelumSystem (); + + /** Shuts down the system and detaches itself from the Ogre engine. + @param cleanup True if we want the shutdown to also delete the system. It's dangerous if + it's intended to be rendered another frame later on, and thus turned off by default. + @remarks The model used in this system <b>won't be deleted here</b>. + This is the shutdown function to be called, and not the destructor itself. + */ + void shutdown (const bool cleanup = false); + + /** Registers a listener in the system. + This listener will be called each frame, before and after Caelum does its work. + @param listener The listener to register. + */ + void addListener (CaelumListener *listener); + + /** Unregisters a listener in the system. + @note The listener must be destroyed out of Caelum. + @param listener The listener to be removed. + */ + void removeListener (CaelumListener *listener); + + /** Event trigger called just before rendering a viewport in a render target Caelum is attached to. + Useful to make objects follow every camera that renders a viewport in a certain render target. + @param e The viewport event, containing the viewport (and camera) to be rendered right now. + */ + void preViewportUpdate (const Ogre::RenderTargetViewportEvent &e); + + /** Gets the universal clock. + * @return A reference to the universal clock attached to this system. + */ + UniversalClock *getUniversalClock () const; + + /** Updates the system. + @param e The frame event (contains the elapsed time since the last update). + */ + bool frameStarted (const Ogre::FrameEvent &e); + + /** Creates the sky dome, or returns the existing one if any yet. + */ + SkyDome *createSkyDome (); + + /** Returns the current sky dome. + @return The current sky dome. + */ + SkyDome *getSkyDome () const; + + /** Destroys the sky dome. + @remarks Remember to detach the sky dome from every viewport it is attached to before destroying it! + */ + void destroySkyDome (); + + /** Creates the sun. + @return The sun. + */ + Sun *createSun (); + + /** Gets the current sun. + @return The sun in use. + */ + Sun *getSun () const; + + /** Destroys the sun. + */ + void destroySun (); + + /** Create the starfield. + @note Returns the existing one if there's one already in use. + @note The old texture will be replaced by the passed one. + @param mapName Name of the starfield texture bitmap. + @return The new or current starfield. + */ + Starfield *createStarfield (const Ogre::String &mapName = "Starfield.jpg"); + + /** Gets the starfield. + @return The starfield. + */ + Starfield *getStarfield () const; + + /** Destroys the current starfield. + @remark Remember to detach it from every viewport before deleting! + */ + void destroyStarfield (); + + /** Sets the sky colour model to be used. + @param model The sky colour model. + */ + void setSkyColourModel (SkyColourModel *model); + + /** Enables/disables the Caelum fog management. + @param manage True if you want Caelum to manage the fog for you. + */ + void setManageFog (bool manage); + + /** Tells if Caelum is managing the fog or not. + @return True if Caelum manages the fog. + */ + bool isFogManaged () const; + + private: + /** Fires the start event to all the registered listeners. + @param e The Ogre FrameEvent object passed this frame. + @return True if all the listeners returned true. + */ + bool fireStartedEvent (const Ogre::FrameEvent &e); + + /** Fires the finish event to all the registered listeners. + @param e The Ogre FrameEvent object passed this frame. + @return True if all the listeners returned true. + */ + bool fireFinishedEvent (const Ogre::FrameEvent &e); +}; + +} // namespace caelum + +#endif //CAELUMSYSTEM_H Added: trunk/python-ogre/ThirdParty/caelum/CameraBoundElement.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/CameraBoundElement.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/CameraBoundElement.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,41 @@ +#ifndef CAMERABOUNDELEMENT_H +#define CAMERABOUNDELEMENT_H + +#include "CaelumPrerequisites.h" + +namespace caelum { + +/** A camera-bound element. + This interface serves as the base class for all the elements that must follow cameras, adjust its size, and such operations. + @author Jesús Alonso Abad + */ +class DllExport CameraBoundElement { +// Attributes ----------------------------------------------------------------- + protected: + /** Defines if the element has an automatic "far" radius or not. + */ + bool mAutoRadius; + +// Methods -------------------------------------------------------------------- + public: + /** Destructor. + */ + virtual ~CameraBoundElement () {}; + + /** Notify new camera conditions. + This method notifies that a new camera is about to be used, so this element can follow it or perform other operations. + @param cam The new camera. + */ + virtual void notifyCameraChanged (Ogre::Camera *cam) = 0; + + /** Forces the "far" size of the element to a specific radius. + In other words: The distance considered the furthest locally to this element. + If the parameter is negative or zero, the radius is set automatically. + @param radius The positive radius of the element, or a negative/zero value to let Caelum to resize it. + */ + virtual void setFarRadius (float radius) = 0; +}; + +} // namespace caelum + +#endif // CAMERABOUNDELEMENT_H Added: trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.cpp 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,68 @@ +#include "CaelumPrecompiled.h" +#include "EarthSunPositionModel.h" + +namespace caelum { + +EarthSunPositionModel::EarthSunPositionModel (const Ogre::Radian lat, const Ogre::Real date) { + setLatitude (lat); + setJulianDate (date); +} + +void EarthSunPositionModel::setLatitude (const Ogre::Radian lat) { + mLatitude = lat; +} + +Ogre::Radian EarthSunPositionModel::getLatitude () const { + return mLatitude; +} + +void EarthSunPositionModel::setJulianDate (const Ogre::Real date) { + mJulianDate = date; +} + +Ogre::Real EarthSunPositionModel::getJulianDate () const { + return mJulianDate; +} + +Ogre::Vector3 EarthSunPositionModel::update (const float time) { + Ogre::Radian declination, zenith, azimuth; // Variables + Ogre::Real x, y, sinL, sinDelta, sinTime, cosL, cosDelta, cosTime, twoPi; // Recurrent values (speed up calculations) + + twoPi = 2 * Ogre::Math::PI; + + declination = Ogre::Radian (0.4093 * Ogre::Math::Sin ((twoPi * (mJulianDate * 365 - 81)) / 368.0)); + + sinL = Ogre::Math::Sin (mLatitude); + cosL = Ogre::Math::Cos (mLatitude); + sinDelta = Ogre::Math::Sin (declination); + cosDelta = Ogre::Math::Cos (declination); + sinTime = Ogre::Math::Sin (twoPi * time); + cosTime = Ogre::Math::Cos (twoPi * time); + + x = (cosL * sinDelta - sinL * cosDelta * cosTime); + y = -cosDelta * sinTime; + + zenith = Ogre::Radian (Ogre::Math::PI * 0.5) - Ogre::Math::ASin (sinL * sinDelta + cosL * cosDelta * cosTime); + azimuth = Ogre::Math::ATan (y / x); + + if (x < 0) + azimuth += Ogre::Radian (Ogre::Math::PI); + else if (y < 0 && x > 0) + azimuth += Ogre::Radian (twoPi); + + Ogre::Vector3 dir = Ogre::Vector3::UNIT_Y; + Ogre::Quaternion rotZen, rotAzi; + + rotZen = Ogre::Quaternion (zenith, Ogre::Vector3::UNIT_X); + rotAzi = Ogre::Quaternion (azimuth, Ogre::Vector3::UNIT_Y); + + dir = rotAzi * (rotZen * dir); + + mSunPosition = dir.normalisedCopy () * -1; + + mSunPosition.z *= -1; + + return mSunPosition; +} + +} // namespace caelum Added: trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/EarthSunPositionModel.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,60 @@ +#ifndef EARTHSUNPOSITIONMODEL_H +#define EARTHSUNPOSITIONMODEL_H + +#include "CaelumPrerequisites.h" +#include "SunPositionModel.h" + +namespace caelum { + +/** The simplified Sun position model for the earth. + Based on experimental data and some simplifications (forumlas taken from the paper + "A Practical Analytic Model for Daylight", by Preetham et al.) + @author Jesús Alonso Abad. + */ +class DllExport EarthSunPositionModel : public SunPositionModel { +// Attributes ----------------------------------------------------------------- + protected: + /// Latitude + Ogre::Radian mLatitude; + + /// Julian date + Ogre::Real mJulianDate; + +// Methods -------------------------------------------------------------------- + public: + /** Basic constructor. + * @param lat The latitude (in radians). + * @param date The Julian date in the range [0, 1] (Jan 1st - Dec 31st respectively). + * Values above will be wrapped and below will be treated as positive. + */ + EarthSunPositionModel (const Ogre::Radian lat, const Ogre::Real date); + + /** Changes the current latitude. + * @param lat The new latitude in radians. + */ + void setLatitude (const Ogre::Radian lat); + + /** Gets the current latitude. + * @return The latitude in radians. + */ + Ogre::Radian getLatitude () const; + + /** Changes the Julian date. + * @param date The current Julian date in the range [0, 1] (Jan 1st - Dec 31st Respectively). + * Values above will be wrapped and below will be treated as positive. + */ + void setJulianDate (const Ogre::Real date); + + /** Gets the Julian date. + * @return The Julian date in the range [0, 1]. + */ + Ogre::Real getJulianDate () const; + + /** @copydoc SunPositionModel::update(). + */ + Ogre::Vector3 update (const float time); +}; + +} // namespace caelum + +#endif // EARTHSUNPOSITIONMODEL_H Added: trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/GeometryFactory.cpp 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,202 @@ +#include "CaelumPrecompiled.h" +#include "GeometryFactory.h" +#include "CaelumSystem.h" + +namespace caelum { + +void GeometryFactory::generateSphericDome (const Ogre::String &name, const unsigned int segments, DomeType type) { + // Return now if already exists + if (Ogre::MeshManager::getSingleton ().resourceExists (name)) + return; + + LOG ("Creating " + name + " sphere mesh resource..."); + + // Use the mesh manager to create the mesh + Ogre::MeshPtr msh = Ogre::MeshManager::getSingleton ().createManual (name, CaelumSystem::RESOURCE_GROUP_NAME); + // Create a submesh + Ogre::SubMesh *sub = msh->createSubMesh (); + + // Create the shared vertex data + Ogre::VertexData *vertexData = new Ogre::VertexData (); + msh->sharedVertexData = vertexData; + + // Define the vertices' format + Ogre::VertexDeclaration *vertexDecl = vertexData->vertexDeclaration; + size_t currOffset = 0; + // Position + vertexDecl->addElement (0, currOffset, Ogre::VET_FLOAT3, Ogre::VES_POSITION); + currOffset += Ogre::VertexElement::getTypeSize (Ogre::VET_FLOAT3); + // Normal + vertexDecl->addElement (0, currOffset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL); + currOffset += Ogre::VertexElement::getTypeSize (Ogre::VET_FLOAT3); + // Texture coordinates + vertexDecl->addElement (0, currOffset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES, 0); + currOffset += Ogre::VertexElement::getTypeSize (Ogre::VET_FLOAT2); + + // Allocate the vertex buffer + switch (type) { + case DT_GRADIENTS: + vertexData->vertexCount = segments * (segments - 1) + 2; + break; + case DT_STARFIELD: + vertexData->vertexCount = (segments + 1) * (segments + 1); + break; + }; + Ogre::HardwareVertexBufferSharedPtr vBuf = Ogre::HardwareBufferManager::getSingleton ().createVertexBuffer (vertexDecl->getVertexSize (0), vertexData->vertexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY, false); + Ogre::VertexBufferBinding *binding = vertexData->vertexBufferBinding; + binding->setBinding (0, vBuf); + + float *pVertex = static_cast<float *>(vBuf->lock (Ogre::HardwareBuffer::HBL_DISCARD)); + + // Allocate the index buffer + switch (type) { + case DT_GRADIENTS: + sub->indexData->indexCount = 2 * segments * (segments - 1) * 3; + break; + case DT_STARFIELD: + // TODO + sub->indexData->indexCount = 2 * (segments + 1) * segments * 3; + break; + }; + sub->indexData->indexBuffer = Ogre::HardwareBufferManager::getSingleton ().createIndexBuffer (Ogre::HardwareIndexBuffer::IT_16BIT, sub->indexData->indexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY, false); + Ogre::HardwareIndexBufferSharedPtr iBuf = sub->indexData->indexBuffer; + unsigned short *pIndices = static_cast<unsigned short *>(iBuf->lock (Ogre::HardwareBuffer::HBL_DISCARD)); + + // Fill the buffers + switch (type) { + case DT_GRADIENTS: + fillGradientsDomeBuffers (pVertex, pIndices, segments); + break; + case DT_STARFIELD: + fillStarfieldDomeBuffers (pVertex, pIndices, segments); + break; + }; + + // Close the vertex buffer + vBuf->unlock (); + + // Close the index buffer + iBuf->unlock (); + + // Finishing it... + sub->useSharedVertices = true; + msh->_setBounds (Ogre::AxisAlignedBox (-1, -1, -1, 1, 1, 1), false); + msh->_setBoundingSphereRadius (1); + msh->load (); + + LOG ("DONE"); +} + +void GeometryFactory::fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments) { + const float deltaLatitude = Ogre::Math::PI / (float )segments; + const float deltaLongitude = Ogre::Math::PI * 2.0 / (float )segments; + + // Generate the rings + for (int i = 1; i < segments; i++) { + float r0 = Ogre::Math::Sin (Ogre::Radian (i * deltaLatitude)); + float y0 = Ogre::Math::Cos (Ogre::Radian (i * deltaLatitude)); + + for (int j = 0; j < segments; j++) { + float x0 = r0 * Ogre::Math::Sin (Ogre::Radian (j * deltaLongitude)); + float z0 = r0 * Ogre::Math::Cos (Ogre::Radian (j * deltaLongitude)); + + *pVertex++ = x0; + *pVertex++ = y0; + *pVertex++ = z0; + + *pVertex++ = -x0; + *pVertex++ = -y0; + *pVertex++ = -z0; + + *pVertex++ = 0; + *pVertex++ = 1 - y0; + } + } + + // Generate the "north pole" + *pVertex++ = 0; // Position + *pVertex++ = 1; + *pVertex++ = 0; + *pVertex++ = 0; // Normal + *pVertex++ = -1; + *pVertex++ = 0; + *pVertex++ = 0; // UV + *pVertex++ = 0; + + // Generate the "south pole" + *pVertex++ = 0; // Position + *pVertex++ = -1; + *pVertex++ = 0; + *pVertex++ = 0; // Normal + *pVertex++ = 1; + *pVertex++ = 0; + *pVertex++ = 0; // UV + *pVertex++ = 2; + + // Generate the mid segments + for (int i = 0; i < segments - 2; i++) { + for (int j = 0; j < segments; j++) { + *pIndices++ = segments * i + j; + *pIndices++ = segments * i + (j + 1) % segments; + *pIndices++ = segments * (i + 1) + (j + 1) % segments; + *pIndices++ = segments * i + j; + *pIndices++ = segments * (i + 1) + (j + 1) % segments; + *pIndices++ = segments * (i + 1) + j; + } + } + + // Generate the upper cap + for (int i = 0; i < segments; i++) { + *pIndices++ = segments * (segments - 1); + *pIndices++ = (i + 1) % segments; + *pIndices++ = i; + } + + // Generate the lower cap + for (int i = 0; i < segments; i++) { + *pIndices++ = segments * (segments - 1) + 1; + *pIndices++ = segments * (segments - 2) + i; + *pIndices++ = segments * (segments - 2) + (i + 1) % segments; + } +} + +void GeometryFactory::fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments) { + const float deltaLatitude = Ogre::Math::PI / (float )segments; + const float deltaLongitude = Ogre::Math::PI * 2.0 / (float )segments; + + // Generate the rings + for (int i = 0; i <= segments; i++) { + float r0 = Ogre::Math::Sin (Ogre::Radian (i * deltaLatitude)); + float y0 = Ogre::Math::Cos (Ogre::Radian (i * deltaLatitude)); + + for (int j = 0; j <= segments; j++) { + float x0 = r0 * Ogre::Math::Sin (Ogre::Radian (j * deltaLongitude)); + float z0 = r0 * Ogre::Math::Cos (Ogre::Radian (j * deltaLongitude)); + + *pVertex++ = x0; + *pVertex++ = y0; + *pVertex++ = z0; + + *pVertex++ = -x0; + *pVertex++ = -y0; + *pVertex++ = -z0; + + *pVertex++ = (float )j / (float )segments; + *pVertex++ = 1 - (y0 * 0.5 + 0.5); + } + } + + // Generate the mid segments + for (int i = 0; i <= segments; i++) { + for (int j = 0; j < segments; j++) { + *pIndices++ = segments * i + j; + *pIndices++ = segments * i + (j + 1) % segments; + *pIndices++ = segments * (i + 1) + (j + 1) % segments; + *pIndices++ = segments * i + j; + *pIndices++ = segments * (i + 1) + (j + 1) % segments; + *pIndices++ = segments * (i + 1) + j; + } + } +} + +} // namespace caelum Added: trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/GeometryFactory.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,47 @@ +#ifndef GEOMETRYFACTORY_H +#define GEOMETRYFACTORY_H + +#include "CaelumPrerequisites.h" + +namespace caelum { + +/** A constructor for a number of caelum geometric objects. + @author Jes\xFAs Alonso Abad. + @version 0.1 + */ +class DllExport GeometryFactory { +// Types and enums ------------------------------------------------------------ + public: + /** Enumeration of types of sky domes. + */ + enum DomeType {DT_GRADIENTS, DT_STARFIELD}; + +// Methods -------------------------------------------------------------------- + public: + /** Creates a longitude-latitude sky dome. + @note Does nothing if the sphere already exists. + @param name The name of the mesh to be created. + @param segments The number of sphere segments. + @param type The type of sky dome to create. + */ + static void generateSphericDome (const Ogre::String &name, const unsigned int segments, DomeType type = DT_GRADIENTS); + + private: + /** Fills the vertex and index buffers for a sky gradients type dome. + @param pVertex Pointer to the vertex buffer. + @param pIndices Pointer to the index buffer. + @param segments Subdivision detail. + */ + static void fillGradientsDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments); + + /** Fills the vertex and index buffers for a stardield type dome. + @param pVertex Pointer to the vertex buffer. + @param pIndices Pointer to the index buffer. + @param segments Subdivision detail. + */ + static void fillStarfieldDomeBuffers (float *pVertex, unsigned short *pIndices, unsigned int segments); +}; + +} // namespace caelum + +#endif //GEOMETRYFACTORY_H Added: trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.cpp 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,32 @@ +#include "CaelumPrecompiled.h" +#include "SimpleSunPositionModel.h" + +namespace caelum { + +SimpleSunPositionModel::SimpleSunPositionModel (Ogre::Degree inc) { + setInclination (inc); +} + +void SimpleSunPositionModel::setInclination (Ogre::Degree inc) { + mInclination = inc; +} + +Ogre::Degree SimpleSunPositionModel::getInclination () const { + return mInclination; +} + +Ogre::Vector3 SimpleSunPositionModel::update (const float time) { + // Get the inclinated axis + Ogre::Vector3 axis = Ogre::Vector3::UNIT_Z; + axis = Ogre::Quaternion (mInclination, Ogre::Vector3::UNIT_X) * axis; + + // Get the inclinated light direction, according to the day time + Ogre::Vector3 dir = Ogre::Vector3::UNIT_Y; + dir = Ogre::Quaternion (Ogre::Radian (time * 2 * Ogre::Math::PI), axis) * dir; + + mSunPosition = dir.normalisedCopy () * -1; + + return mSunPosition * -1; +} + +} // namespace caelum Added: trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/SimpleSunPositionModel.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,44 @@ +#ifndef SIMPLESUNPOSITIONMODEL_H +#define SIMPLESUNPOSITIONMODEL_H + +#include "CaelumPrerequisites.h" +#include "SunPositionModel.h" + +namespace caelum { + +/** A simple circular sun position model. + It just creates an inclinated circular orbit. + @author Jesús Alonso Abad. + */ +class DllExport SimpleSunPositionModel : public SunPositionModel { +// Attributes ----------------------------------------------------------------- + protected: + /** The sun trajectory inclination. This is similar to the earth's rotation axis inclination. + */ + Ogre::Degree mInclination; + +// Methods -------------------------------------------------------------------- + public: + /** Basic constructor. + @param inc The orbit inclination. + */ + SimpleSunPositionModel (Ogre::Degree inc); + + /** Changes the orbit inclination. + @param inc The inclination in degrees. + */ + void setInclination (Ogre::Degree inc); + + /** Gets the orbit inclination. + @return The orbit inclination in degrees. + */ + Ogre::Degree getInclination () const; + + /** @copydoc SunPositionModel::update(). + */ + Ogre::Vector3 update (const float time); +}; + +} // namespace caelum + +#endif // SIMPLESUNPOSITIONMODEL_H Added: trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/SkyColourModel.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,76 @@ +#ifndef SKYCOLOURMODEL_H +#define SKYCOLOURMODEL_H + +#include "CaelumPrerequisites.h" + +namespace caelum { + +/** Sky colour model interface. + @author Jes\xFAs Alonso Abad + @version 0.1 + */ +class DllExport SkyColourModel { +// Attributes ----------------------------------------------------------------- + protected: + /** A reference to the sky gradients texture unit state. + */ + Ogre::TextureUnitState *mSkyGradientsTextureUnitState; + + /** The sky gradients image (for lookups). + */ + Ogre::Image *mSkyGradientsImage; + +// Methods -------------------------------------------------------------------- + public: + /** Constructor method. + */ + SkyColourModel () { + mSkyGradientsTextureUnitState = 0; + mSkyGradientsImage = 0; + } + + /** Destructor. + */ + virtual ~SkyColourModel () {} + + /** Sets the sky gradients texture unit in use. + @param tus The TextureUnitState to be modified. + */ + void setSkyGradientsTextureUnitState (Ogre::TextureUnitState *tus) { + mSkyGradientsTextureUnitState = tus; + } + + /** Gets the fog colour for a certain daytime. + @param time The current time. + @param sunDir The sun direction. + @return The fog colour. + */ + virtual Ogre::ColourValue getFogColour (float time, const Ogre::Vector3 &sunDir) = 0; + + /** Gets the fog density for a certain daytime. + @param time The current time. + @param sunDir The sun direction. + @return The fog density. + */ + virtual float getFogDensity (float time, const Ogre::Vector3 &sunDir) = 0; + + /** Gets the sun colour for a certain daytime. + @param time The current time. + @param sunDir The sun direction. + @return The sun colour. + */ + virtual Ogre::ColourValue getSunColour (float time, const Ogre::Vector3 &sunDir) = 0; + + /** Updates the sky colour material, according to various factors. + @param fpp The material fragment program parameters (null if it's not supported) + @param vpp The material vertex program parameters (null if it's not supported) + @param time The local daytime, ranging [0, 1] + @param sunDir The sun light direction. + @return True if everything went fine. + */ + virtual bool updateMaterial (Ogre::GpuProgramParametersSharedPtr fpp, Ogre::GpuProgramParametersSharedPtr vpp, float time, const Ogre::Vector3 &sunDir) = 0; +}; + +} // namespace caelum + +#endif //SKYCOLOURMODEL_H Added: trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/SkyDome.cpp 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,209 @@ +#include "CaelumPrecompiled.h" +#include "SkyDome.h" +#include "CaelumSystem.h" +#include "GeometryFactory.h" +#include "CaelumExceptions.h" + +namespace caelum { + +const Ogre::String SkyDome::mSphericDomeResourceName = "CaelumSphericDome"; +const Ogre::String SkyDome::SKY_DOME_MATERIAL_NAME = "CaelumSkyDomeMaterial"; + +SkyDome::SkyDome (Ogre::SceneManager *sceneMgr) { + mAutoRadius = true; + + createSkyDomeMaterial (); + + GeometryFactory::generateSphericDome (mSphericDomeResourceName, 32); + Ogre::Entity *ent = sceneMgr->createEntity ("Dome", mSphericDomeResourceName); + ent->setMaterialName (SKY_DOME_MATERIAL_NAME); + ent->setRenderQueueGroup (Ogre::RENDER_QUEUE_SKIES_EARLY + 2); + ent->setCastShadows (false); + + mNode = sceneMgr->getRootSceneNode ()->createChildSceneNode (); + mNode->attachObject (ent); +} + +SkyDome::~SkyDome () { + if (mNode) { + // Detach and destroy attached entity. + Ogre::Entity *ent = static_cast<Ogre::Entity *>(mNode->detachObject ("Dome")); + ent->_getManager ()->destroyEntity (ent); + + // Destroy the node + static_cast<Ogre::SceneNode *>(mNode->getParent ())->removeAndDestroyChild (mNode->getName ()); + mNode = 0; + } + + destroySkyDomeMaterial (); +} + +void SkyDome::notifyCameraChanged (Ogre::Camera *cam) { + mNode->setPosition (cam->getRealPosition ()); + if (mAutoRadius) { + if (cam->getFarClipDistance () > 0) + mNode->setScale (Ogre::Vector3::UNIT_SCALE * (cam->getFarClipDistance () - CAMERA_DISTANCE_MODIFIER)); + else + mNode->setScale (Ogre::Vector3::UNIT_SCALE * (cam->getNearClipDistance () + CAMERA_DISTANCE_MODIFIER)); + } +} + +void SkyDome::setFarRadius (float radius) { + if (radius > 0) { + mNode->setScale (Ogre::Vector3::UNIT_SCALE * radius); + mAutoRadius = false; + } + else { + mAutoRadius = true; + } +} + +void SkyDome::setSunDirection (Ogre::Vector3 dir) { + if (!mSkyDomeMaterial.isNull ()) { + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { + mSkyDomeMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ()->setNamedConstant ("sunDirection", dir); + } + } +} + +void SkyDome::setLightAbsorption (float absorption) const { + if (absorption > 1) + absorption = 1; + else if (absorption < 0) + absorption = 0; + + if (!mSkyDomeMaterial.isNull ()) { + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { + mSkyDomeMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters ()->setNamedConstant ("lightAbsorption", absorption); + } + } +} + +void SkyDome::setLightScattering (float scattering) const { + if (scattering <= 0) + scattering = 0.00001; + + if (!mSkyDomeMaterial.isNull ()) { + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { + mSkyDomeMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ()->setNamedConstant ("lightInvScattering", 1.0f / scattering); + } + } +} + +void SkyDome::setAtmosphereHeight (float height) const { + if (height <= 0) + height = 0.00001; + else if (height > 1) + height = 1; + + if (!mSkyDomeMaterial.isNull ()) { + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { + mSkyDomeMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters ()->setNamedConstant ("atmosphereInvHeight", 1.0f / height); + } + } +} + +void SkyDome::updateSkyDomeMaterialTime (SkyColourModel *skyColourModel, float time, Sun *sun) { + skyColourModel->updateMaterial (mSkyDomeMaterial->getTechnique (0)->getPass (0)->getFragmentProgramParameters (), + mSkyDomeMaterial->getTechnique (0)->getPass (0)->getVertexProgramParameters (), + time, + sun ? sun->getSunDirection () : Ogre::Vector3::UNIT_Y); +} + +Ogre::TextureUnitState *SkyDome::getTextureUnitState () { + if (mSkyDomeMaterial.isNull ()) + return 0; + + return mSkyDomeMaterial->getTechnique (0)->getPass (0)->getTextureUnitState (0); +} + +void SkyDome::createSkyDomeMaterial () { + Ogre::MaterialPtr mat; + + // Check support + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_FRAGMENT_PROGRAM)) { + // TODO: Check if the profiles used are supported + } + else { + throw new UnsupportedException (0, "The card doesn't support the sky dome material. Fragment programs are used.", "SkyDome", "SkyDome.cpp", -1); + } + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { + // TODO: Check if the profiles used are supported + } + else { + throw new UnsupportedException (0, "The card doesn't support the sky dome material. Vertex programs are used.", "SkyDome", "SkyDome.cpp", -1); + } + + LOG ("Generating sky dome material..."); + if (!Ogre::MaterialManager::getSingleton ().resourceExists (SKY_DOME_MATERIAL_NAME)) { + LOG ("\tMaterial not found; creating..."); + mat = static_cast<Ogre::MaterialPtr>(Ogre::MaterialManager::getSingleton ().create (SKY_DOME_MATERIAL_NAME, CaelumSystem::RESOURCE_GROUP_NAME)); + mat->setReceiveShadows (false); + LOG ("\t\tMaterial [OK]"); + Ogre::Pass *pass = mat->getTechnique (0)->getPass (0); + pass->setSceneBlending (Ogre::SBT_TRANSPARENT_ALPHA); + pass->setDepthCheckEnabled (false); + pass->setDepthWriteEnabled (false); + pass->setLightingEnabled (false); + pass->setFog (true); + // Bind the sky light absorption shader if capable to + // TODO + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_FRAGMENT_PROGRAM)) { + Ogre::HighLevelGpuProgramPtr fp = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram ("SkyDomeFP", CaelumSystem::RESOURCE_GROUP_NAME, "cg", Ogre::GPT_FRAGMENT_PROGRAM); + fp->setSourceFile ("CaelumShaders.cg"); + fp->setParameter ("entry_point", "SkyDome_fp"); + fp->setParameter ("profiles", "ps_2_0 arbfp1"); + pass->setFragmentProgram ("SkyDomeFP"); + Ogre::GpuProgramParametersSharedPtr parameters = pass->getFragmentProgramParameters(); + parameters->setNamedConstant ("offset", 0.0f); + parameters->setNamedAutoConstant ("hazeColour", Ogre::GpuProgramParameters::ACT_FOG_COLOUR); + } + if (Ogre::Root::getSingleton ().getRenderSystem ()->getCapabilities ()->hasCapability (Ogre::RSC_VERTEX_PROGRAM)) { + Ogre::HighLevelGpuProgramPtr vp = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram ("SkyDomeVP", CaelumSystem::RESOURCE_GROUP_NAME, "cg", Ogre::GPT_VERTEX_PROGRAM); + vp->setSourceFile ("CaelumShaders.cg"); + vp->setParameter ("entry_point", "SkyDome_vp"); + vp->setParameter ("profiles", "vs_2_0 arbvp1"); + pass->setVertexProgram ("SkyDomeVP"); + Ogre::GpuProgramParametersSharedPtr parameters = pass->getVertexProgramParameters(); + parameters->setNamedAutoConstant ("worldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); + parameters->setNamedConstant ("sunDirection", Ogre::Vector3 (1, 0, 0)); + } + LOG ("\t\tPass [OK]"); + Ogre::TextureUnitState *tus = pass->createTextureUnitState (); + tus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_WRAP, Ogre::TextureUnitState::TAM_CLAMP, Ogre::TextureUnitState::TAM_CLAMP); + LOG ("\t\tTextureUnit - Sky gradient [OK]"); + tus = pass->createTextureUnitState (); + tus->setTextureName ("AtmosphereDepth.png", Ogre::TEX_TYPE_1D); + tus->setTextureAddressingMode (Ogre::TextureUnitState::TAM_CLAMP, Ogre::TextureUnitState::TAM_WRAP, Ogre::TextureUnitState::TAM_WRAP); + LOG ("\t\tTextureUnit - Atmosphere depth [OK]"); + mat->load (); + LOG ("\tDONE"); + } + else { + mat = static_cast<Ogre::MaterialPtr>(Ogre::MaterialManager::getSingleton ().getByName (SKY_DOME_MATERIAL_NAME)); + } + LOG ("DONE"); + + mSkyDomeMaterial = mat; +} + +void SkyDome::destroySkyDomeMaterial () { + LOG ("Removing sky dome material..."); + if ((Ogre::HighLevelGpuProgramManager::getSingletonPtr()->resourceExists("SkyLightAbsorptionFP"))) { + LOG ("Removing sky dome SkyLightAbsorptionFP..."); + Ogre::HighLevelGpuProgramManager::getSingletonPtr()->remove("SkyLightAbsorptionFP"); + } + + if ((Ogre::HighLevelGpuProgramManager::getSingletonPtr()->resourceExists("SkyLightAbsorptionVP"))) { + LOG ("Removing sky dome SkyLightAbsorptionVP..."); + Ogre::HighLevelGpuProgramManager::getSingletonPtr()->remove("SkyLightAbsorptionVP"); + } + + if (!Ogre::MaterialManager::getSingleton ().resourceExists (SKY_DOME_MATERIAL_NAME)) { + Ogre::MaterialManager::getSingleton ().remove (SKY_DOME_MATERIAL_NAME); + } + mSkyDomeMaterial.setNull (); + LOG ("DONE"); +} + +} // namespace caelum Added: trunk/python-ogre/ThirdParty/caelum/SkyDome.h =================================================================== --- trunk/python-ogre/ThirdParty/caelum/SkyDome.h (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/SkyDome.h 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,97 @@ +#ifndef SKYDOME_H +#define SKYDOME_H + +#include "CaelumPrerequisites.h" +#include "CameraBoundElement.h" +#include "SkyColourModel.h" +#include "Sun.h" + +namespace caelum { + +/** A sky dome element. + @author Jes\xFAs Alonso Abad + */ +class DllExport SkyDome : public CameraBoundElement { +// Attributes ----------------------------------------------------------------- + protected: + /** Control scene node. + */ + Ogre::SceneNode *mNode; + + /** Name of the spheric dome resource. + */ + static const Ogre::String mSphericDomeResourceName; + + /** Name of the dome material. + */ + static const Ogre::String SKY_DOME_MATERIAL_NAME; + + /** Reference to the sky dome material. + */ + Ogre::MaterialPtr mSkyDomeMaterial; + +// Methods -------------------------------------------------------------------- + public: + /** Constructor (DO NOT USE! Use CaelumSystem::createSkyDome instead). + @param sceneMgr The scene manager where this sky dome will be created. + */ + SkyDome (Ogre::SceneManager *sceneMgr); + + /** Destructor (DO NOT USE! Use CaelumSystem::destroySkyDome instead). + */ + virtual ~SkyDome (); + + /** @copydoc CameraBoundElement::notifyCameraChanged(). + */ + void notifyCameraChanged (Ogre::Camera *cam); + + /** @copydoc CameraBoundElement::setFarRadius(). + */ + void setFarRadius (float radius); + + /** Sets the sun direction. + @param dir The sun light direction. + */ + void setSunDirection (Ogre::Vector3 dir); + + /** Sets the new light absorption factor. + @param absorption The light absorption factor; a number in the range [0, 1], the lower, the less light the atmosphere will absorb. + */ + void setLightAbsorption (float absorption) const; + + /** Sets the light scattering factor. + @param scattering The light scattering factor; a number major than zero. + */ + void setLightScattering (float scattering) const; + + /** Sets the atmosphere height factor. + @param height The atmosphere height factor; a number in the range (0, 1]. + */ + void setAtmosphereHeight (float height) const; + + /** Updates the sky dome material to match the local time. + @param skyColourModel The sky colour model in use. + @param time The local time. + @param sun The sun. + */ + void updateSkyDomeMaterialTime (SkyColourModel *skyColourModel, float time, Sun *sun); + + /** Returns the sky dome texture unit state. + @return The texture unit state of the sky dome material. + */ + Ogre::TextureUnitState *getTextureUnitState (); + + private: + /** Internal method to create the sky dome material. + * @throws UnsupportedException if the material isn't supported. + */ + void createSkyDomeMaterial (); + + /** Internal method to destroy the sky dome material. + */ + void destroySkyDomeMaterial (); +}; + +} // namespace caelum + +#endif //SKYDOME_H Added: trunk/python-ogre/ThirdParty/caelum/Starfield.cpp =================================================================== --- trunk/python-ogre/ThirdParty/caelum/Starfield.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/caelum/Starfield.cpp 2007-10-05 13:06:34 UTC (rev 410) @@ -0,0 +1,116 @@ +#include "CaelumPrecompiled.h" +#include "Starfield.h" +#include "CaelumSystem.h" +#include "GeometryFactory.h" + +namespace caelum { + +const Ogre::String Starfield::mStarfieldDomeResourceName = "CaelumStarfieldDome"; +const Ogre::String Starfield::STARFIELD_MATERIAL_NAME = "CaelumStarfieldMaterial"; + +Starfield::Starfield (Ogre::SceneManager *sceneMgr) { + mAutoRadius = true; + mInclination = Ogre::Degree (0); + + createStarfieldMaterial (); + + GeometryFactory::generateSphericDome (mStarfieldDomeResourceName, 32, GeometryFactory::DT_STARFIELD); + Ogre::Entity *ent = sceneMgr->createEntity ("StarfieldDome", mStarfieldDomeResourceName); + ent->setMaterialName (STARFIELD_MATERIAL_NAME); + ent->setRenderQueueGroup (Ogre::RENDER... [truncated message content] |
From: <and...@us...> - 2007-10-05 08:20:17
|
Revision: 409 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=409&view=rev Author: andy_miller Date: 2007-10-05 01:20:21 -0700 (Fri, 05 Oct 2007) Log Message: ----------- Numerous updates for 1.1 Added ET Demo Added navi demo Modified Paths: -------------- trunk/python-ogre/ChangeLog.txt trunk/python-ogre/SConstruct trunk/python-ogre/code_generators/common_utils/__init__.py trunk/python-ogre/code_generators/common_utils/extract_documentation.py trunk/python-ogre/code_generators/ode/customization_data.py trunk/python-ogre/code_generators/ogre/generate_code.py trunk/python-ogre/code_generators/ogre/hand_made_wrappers.py trunk/python-ogre/code_generators/ogreal/generate_code.py trunk/python-ogre/code_generators/quickgui/generate_code.py trunk/python-ogre/demos/et/Demo_CEGUI_ET.py trunk/python-ogre/demos/et/resources.cfg Added Paths: ----------- trunk/python-ogre/PythonOgreInstallCreator.iss trunk/python-ogre/code_generators/navi/Navi.h trunk/python-ogre/code_generators/navi/NaviManager.h trunk/python-ogre/demos/et/media/ trunk/python-ogre/demos/et/media/ETShader.program trunk/python-ogre/demos/et/media/ETTerrain.material trunk/python-ogre/demos/et/media/ETcoverage.0.png trunk/python-ogre/demos/et/media/ETcoverage.1.png trunk/python-ogre/demos/et/media/ETlightmap.png trunk/python-ogre/demos/et/media/ETterrain.cfg trunk/python-ogre/demos/et/media/ETterrain.png trunk/python-ogre/demos/et/media/PSLighting.cg trunk/python-ogre/demos/et/media/PSSplat.cg trunk/python-ogre/demos/et/media/PSSplat2.cg trunk/python-ogre/demos/et/media/VSLodMorph.cg trunk/python-ogre/demos/et/media/VSLodMorph2.cg trunk/python-ogre/demos/et/media/brush.png trunk/python-ogre/demos/et/media/splatting0.png trunk/python-ogre/demos/et/media/splatting1.png trunk/python-ogre/demos/et/media/splatting2.png trunk/python-ogre/demos/et/media/splatting3.png trunk/python-ogre/demos/et/media/splatting4.png trunk/python-ogre/demos/et/media/splatting5.png trunk/python-ogre/demos/media/fonts/read_me.html trunk/python-ogre/demos/navi/Media/ trunk/python-ogre/demos/navi/Media/NaviDemo.material trunk/python-ogre/demos/navi/Media/OgreCore.zip trunk/python-ogre/demos/navi/Media/Thumbs.db trunk/python-ogre/demos/navi/Media/cerulean.jpg trunk/python-ogre/demos/navi/Media/clouds.jpg trunk/python-ogre/demos/navi/Media/cursor1.png trunk/python-ogre/demos/navi/Media/cursor2.png trunk/python-ogre/demos/navi/Media/cursor3.png trunk/python-ogre/demos/navi/Media/cursor4.png trunk/python-ogre/demos/navi/Media/cursor5.png trunk/python-ogre/demos/navi/Media/cursor6.png trunk/python-ogre/demos/navi/Media/cursorMove.png trunk/python-ogre/demos/navi/Media/grass.jpg trunk/python-ogre/demos/navi/Media/knot.mesh trunk/python-ogre/demos/navi/NaviLocal/ trunk/python-ogre/demos/navi/NaviLocal/Navi.js trunk/python-ogre/demos/navi/NaviLocal/Navi.vcproj trunk/python-ogre/demos/navi/NaviLocal/Navi.vcproj.JNPR.amiller.user trunk/python-ogre/demos/navi/NaviLocal/Thumbs.db trunk/python-ogre/demos/navi/NaviLocal/equip.html trunk/python-ogre/demos/navi/NaviLocal/hp_down.png trunk/python-ogre/demos/navi/NaviLocal/hp_up.png trunk/python-ogre/demos/navi/NaviLocal/hpbar.png trunk/python-ogre/demos/navi/NaviLocal/hpbar_gloss.png trunk/python-ogre/demos/navi/NaviLocal/jsTrace.js trunk/python-ogre/demos/navi/NaviLocal/menubar.html trunk/python-ogre/demos/navi/NaviLocal/mootools.v1.1.js trunk/python-ogre/demos/navi/NaviLocal/mootools.v1.11.js trunk/python-ogre/demos/navi/NaviLocal/navichat_bg.png trunk/python-ogre/demos/navi/NaviLocal/naviequip_bg.png trunk/python-ogre/demos/navi/NaviLocal/navimenu_bg.png trunk/python-ogre/demos/navi/NaviLocal/off.png trunk/python-ogre/demos/navi/NaviLocal/on.png trunk/python-ogre/demos/navi/NaviLocal/shield.jpg trunk/python-ogre/demos/navi/NaviLocal/status.html trunk/python-ogre/demos/navi/NaviLocal/status_bg.png trunk/python-ogre/demos/navi/NaviLocal/status_gloss.png trunk/python-ogre/demos/navi/NaviLocal/sword.jpg trunk/python-ogre/demos/navi/NaviProfile/ trunk/python-ogre/demos/navi/chrome/ trunk/python-ogre/demos/navi/components/ trunk/python-ogre/demos/navi/greprefs/ trunk/python-ogre/demos/navi/ogre.cfg trunk/python-ogre/demos/navi/plugins/ trunk/python-ogre/demos/navi/res/ trunk/python-ogre/packages_2.5/ogre/addons/et/ trunk/python-ogre/packages_2.5/ogre/addons/et/__init__.py trunk/python-ogre/packages_2.5/ogre/addons/ogreforests/ trunk/python-ogre/packages_2.5/ogre/addons/ogreforests/__init__.py Removed Paths: ------------- trunk/python-ogre/SConstruct.vc8 Modified: trunk/python-ogre/ChangeLog.txt =================================================================== --- trunk/python-ogre/ChangeLog.txt 2007-10-05 04:16:07 UTC (rev 408) +++ trunk/python-ogre/ChangeLog.txt 2007-10-05 08:20:21 UTC (rev 409) @@ -1,22 +1,26 @@ -xxx 2007: Version 1.1 Release -=============================== +October 05 2007: Version 1.1 Release +==================================== * Built with Ogre 1.4.4+ * Added Theora module for video playback +* Added Plib support - Sound and Networking + subset of ssg +* Added OgreForests -- a paging landscape manager +* Added Editable Terrain (Thanks Dermont) +* Added OgreBullet Support -- sperate modules for collission and dynamics +* Added Navi gui support - This REALLY needs Python built with VC8 and so IS BUGGY + all current python binaries for Windows are built with VC7 with an older MSVC runtime library that conflicts + with the javascript interpreter thats part of the Mozilla libraries * Code generated with updated Py++ that fixes 'already exposed' issues with multiple modules * Updated QuickGui - SVN * Updated NxOgre using version 0.9-38 -* Added initial Plib support - Sound and Networking + subset of ssg +* updated NxOgre config and framework (bug fixes) * Bug fix to OgreAL to fix ogg playback and general stability * Ogre code generation improvements - Ctype support for 'void const *' (changed to unsigned int) previous version only modified 'void *' (missed the const variables) Fixed cases where multiple void *'s in argument list - only first one was being fixed Moved common functions into common_utils so single place to fix -- need to implement for other modules + Created VARNAME_Copy helper functions for readonly variables, incase you want a copy for your own use * added helper function for PixelBox ("getData") to give access to the data variable * updated the vcredist files to the current version -* updated NxOgre config and framework (bug fixes) -* Added "navi" gui support - Now this REALLY needs Python built with VC8 and so IS BUGGY - all current python binaries for Windows are built with VC7 with an older MSVC runtime library that conflicts - with the javascript interpreter thats part of the Mozilla libraries * demos/media is now the standard OgreSDK media directory where necessary each demo directory has a ./media directory for additional 'demo' media Added: trunk/python-ogre/PythonOgreInstallCreator.iss =================================================================== --- trunk/python-ogre/PythonOgreInstallCreator.iss (rev 0) +++ trunk/python-ogre/PythonOgreInstallCreator.iss 2007-10-05 08:20:21 UTC (rev 409) @@ -0,0 +1,476 @@ +; +; Python-Ogre setup script +; +[Setup] +AppName=Python-Ogre +AppVerName=Python-Ogre 1.1 +DefaultDirName=C:\PythonOgre +DefaultGroupName=Python-Ogre +OutputBaseFilename=PythonOgreInstaller +OutputDir=C:\temp +SourceDir=C:\Development\PythonOgreRelease +VersionInfoDescription=Release 1.1 of Python-Ogre +AllowNoIcons=true +AppPublisher=OpenSource +AppPublisherURL=http://www.python-ogre.org +AppSupportURL=http://www.python-ogre.org +AppUpdatesURL=http://www.python-ogre.org +AppVersion=1.1.0 +LicenseFile=LICENSE.GPL +Compression=lzma +InfoBeforeFile=InstallWarning.rtf +InfoAfterFile=postinstall.rtf +SolidCompression=true +AppCopyright=LPGL +VersionInfoCompany=OpenSource +VersionInfoTextVersion=1.1.0 +VersionInfoCopyright=PythonOgre Development Team +RestartIfNeededByRun=false +UninstallDisplayName=PythonOgre +WizardImageFile=compiler:WizModernImage-IS.bmp +WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp +VersionInfoVersion=1.1.0 +[Files] +; base files, demos and tools +Source: *; DestDir: {app} +Source: plugins\*; DestDir: {app}\plugins +Source: tools\*; DestDir: {app}\tools +Source: demos\*; DestDir: {app}\demos; Flags: recursesubdirs +Source: docs\*; DestDir: {app}\docs; Flags: recursesubdirs +; the python modules - in the event we find python +Source: packages_2.5\*; DestDir: {code:GetPythonSiteDir}; Flags: recursesubdirs; Check: SelectedPython('2.5') +; the python modules again - if we don't find python we install both versions in the app directory +Source: packages_2.5\*; DestDir: {app}\packages_2.5; Flags: recursesubdirs; Check: NoPythonFound +; +; we need to remove the .pyc files when we uninstall +; +Source: ThirdParty\dxwebsetup.exe; DestDir: {app}\ThirdParty +Source: ThirdParty\vcredist_x86.exe; DestDir: {app}\ThirdParty + +[UninstallDelete] +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\renderer\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\renderer\OGRE\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\io\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\io\OIS\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\gui\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\gui\CEGUI\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\gui\QuickGUI\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\gui\BetaGUI\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\sound\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\sound\OgreAL\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\OgreRefApp\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\ODE\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\OgreOde\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\OgreNewt\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\NxOgre\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\Physx\*.pyc +Type: filesandordirs; Name: {code:GetPythonSiteDir}\ogre\physics\OpCode\*.pyc + +Type: files; Name: {app}\demos\CEGUI\*.pyc +Type: files; Name: {app}\demos\CEGUI\*.log +Type: files; Name: {app}\demos\CEGUI\*.cfg +Type: files; Name: {app}\demos\GUI\*.pyc +Type: files; Name: {app}\demos\GUI\*.log +Type: files; Name: {app}\demos\GUI\*.cfg +Type: files; Name: {app}\demos\ogre\*.pyc +Type: files; Name: {app}\demos\ogre\*.log +Type: files; Name: {app}\demos\ogre\*.cfg +Type: files; Name: {app}\demos\ogreode\*.pyc +Type: files; Name: {app}\demos\ogreode\*.log +Type: files; Name: {app}\demos\ogreode\*.cfg +Type: files; Name: {app}\demos\ogrenewt\*.pyc +Type: files; Name: {app}\demos\ogrenewt\*.log +Type: files; Name: {app}\demos\ogrenewt\*.cfg +Type: files; Name: {app}\demos\ogreal\*.pyc +Type: files; Name: {app}\demos\ogreal\*.log +Type: files; Name: {app}\demos\ogreal\*.cfg +Type: files; Name: {app}\demos\ode\*.pyc +Type: files; Name: {app}\demos\ode\*.log +Type: files; Name: {app}\demos\ode\*.cfg +Type: files; Name: {app}\demos\ffmpeg\*.pyc +Type: files; Name: {app}\demos\ffmpeg\*.log +Type: files; Name: {app}\demos\ffmpeg\*.cfg +Type: files; Name: {app}\demos\nxogre\*.pyc +Type: files; Name: {app}\demos\nxogre\*.log +Type: files; Name: {app}\demos\nxogre\*.cfg +Type: files; Name: {app}\demos\dshow\*.pyc +Type: files; Name: {app}\demos\dshow\*.log +Type: files; Name: {app}\demos\dshow\*.cfg +Type: dirifempty; Name: {app}\demos\CEGUI +Type: dirifempty; Name: {app}\demos\GUI +Type: dirifempty; Name: {app}\demos\ogre +Type: dirifempty; Name: {app}\demos\ogreode +Type: dirifempty; Name: {app}\demos\ogrenewt +Type: dirifempty; Name: {app}\demos\ogreal +Type: dirifempty; Name: {app}\demos\ode +Type: dirifempty; Name: {app}\demos\nxogre +Type: dirifempty; Name: {app}\demos\ffmepg +Type: dirifempty; Name: {app}\demos\dshow +Type: dirifempty; Name: {app}\demos +Type: dirifempty; Name: {app} + +; +; I REALLY DON'T like doing this but if people have used a previous version of Python-Ogre +; I need to remove it to force any existing source code to fail and hence have them +; update to the new directory structure.. +; being very conservative in this!!!!!!!!!!!!! +; +[InstallDelete] +Type: files; Name: {code:GetPythonSiteDir}\Ogre\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\OIS\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\GUI\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\OgreOde\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\OgreNewt\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\OgreAL\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\OgreRefApp\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\ODE\*.pyd +Type: files; Name: {code:GetPythonSiteDir}\FMOD\*.pyd + +Type: files; Name: {code:GetPythonSiteDir}\Ogre\*.dll +Type: files; Name: {code:GetPythonSiteDir}\OIS\*.dll +Type: files; Name: {code:GetPythonSiteDir}\GUI\*.dll +Type: files; Name: {code:GetPythonSiteDir}\OgreOde\*.dll +Type: files; Name: {code:GetPythonSiteDir}\OgreNewt\*.dll +Type: files; Name: {code:GetPythonSiteDir}\OgreAL\*.dll +Type: files; Name: {code:GetPythonSiteDir}\OgreRefApp\*.dll +Type: files; Name: {code:GetPythonSiteDir}\ODE\*.dll +Type: files; Name: {code:GetPythonSiteDir}\FMOD\*.dll + +Type: files; Name: {code:GetPythonSiteDir}\Ogre\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\OIS\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\GUI\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\OgreOde\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\OgreNewt\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\OgreAL\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\OgreRefApp\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\ODE\_*.p* +Type: files; Name: {code:GetPythonSiteDir}\FMOD\_*.p* + +Type: files; Name: {code:GetPythonSiteDir}\Ogre\sf_*.* + +Type: files; Name: {code:GetPythonSiteDir}\Ogre +Type: files; Name: {code:GetPythonSiteDir}\OIS +Type: files; Name: {code:GetPythonSiteDir}\GUI +Type: files; Name: {code:GetPythonSiteDir}\OgreOde +Type: files; Name: {code:GetPythonSiteDir}\OgreNewt +Type: files; Name: {code:GetPythonSiteDir}\OgreAL +Type: files; Name: {code:GetPythonSiteDir}\OgreRefApp +Type: files; Name: {code:GetPythonSiteDir}\ODE +Type: files; Name: {code:GetPythonSiteDir}\FMOD + +Type: dirifempty; Name: {code:GetPythonSiteDir}\Ogre +Type: dirifempty; Name: {code:GetPythonSiteDir}\OIS +Type: dirifempty; Name: {code:GetPythonSiteDir}\GUI +Type: dirifempty; Name: {code:GetPythonSiteDir}\OgreOde +Type: dirifempty; Name: {code:GetPythonSiteDir}\OgreNewt +Type: dirifempty; Name: {code:GetPythonSiteDir}\OgreAL +Type: dirifempty; Name: {code:GetPythonSiteDir}\OgreRefApp +Type: dirifempty; Name: {code:GetPythonSiteDir}\ODE + +[Icons] +Name: {group}\Ogre Demos\Bezier; Filename: {code:GetPythonExe}; Parameters: Demo_Bezier.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\BSP; Filename: {code:GetPythonExe}; Parameters: Demo_BSP.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\BSP_Collision; Filename: {code:GetPythonExe}; Parameters: Demo_BspCollision.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Camera Tracking; Filename: {code:GetPythonExe}; Parameters: Demo_CameraTracking.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\CEL Shading; Filename: {code:GetPythonExe}; Parameters: Demo_CelShading.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Compositor; Filename: {code:GetPythonExe}; Parameters: Demo_Compositor.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\ENV Map; Filename: {code:GetPythonExe}; Parameters: Demo_EnvMap.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Facial; Filename: {code:GetPythonExe}; Parameters: Demo_Facial.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Fish; Filename: {code:GetPythonExe}; Parameters: Demo_OneFish.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Fresnel; Filename: {code:GetPythonExe}; Parameters: Demo_Fresnel.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Grass; Filename: {code:GetPythonExe}; Parameters: Demo_Grass.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Lighting; Filename: {code:GetPythonExe}; Parameters: Demo_Lighting.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Particles; Filename: {code:GetPythonExe}; Parameters: Demo_ParticleFX.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Render to Texture; Filename: {code:GetPythonExe}; Parameters: Demo_RenderToTexture.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Shadows; Filename: {code:GetPythonExe}; Parameters: Demo_Shadows_Org.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Animation 1; Filename: {code:GetPythonExe}; Parameters: Demo_SkeletalAnimation.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Animation 2; Filename: {code:GetPythonExe}; Parameters: Demo_SkeletonAnimation.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Sky Box; Filename: {code:GetPythonExe}; Parameters: Demo_SkyBox.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Sky Dome; Filename: {code:GetPythonExe}; Parameters: Demo_SkyDome.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Sky Plane; Filename: {code:GetPythonExe}; Parameters: Demo_SkyPlane.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Smoke; Filename: {code:GetPythonExe}; Parameters: Demo_Smoke.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Terrain; Filename: {code:GetPythonExe}; Parameters: Demo_Terrain.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Textures; Filename: {code:GetPythonExe}; Parameters: Demo_TextureFX.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\Transparency; Filename: {code:GetPythonExe}; Parameters: Demo_Transparency.py; WorkingDir: {app}\Demos\Ogre +Name: {group}\Ogre Demos\WX Gui; Filename: {code:GetPythonExe}; Parameters: Demo_WX.py; WorkingDir: {app}\Demos\Ogre + +Name: {group}\GUI\CEGUI - Basic; Filename: {code:GetPythonExe}; Parameters: Demo_CEGUI_Gui.py; WorkingDir: {app}\Demos\gui +Name: {group}\GUI\CEGUI Drag and Drop; Filename: {code:GetPythonExe}; Parameters: Demo_CEGUI_DragnDrop.py; WorkingDir: {app}\Demos\gui +Name: {group}\GUI\CEGUI - Nice; Filename: {code:GetPythonExe}; Parameters: Demo_CEGUI_NewGui.py; WorkingDir: {app}\Demos\gui +Name: {group}\GUI\QuickGUI-01; Filename: {code:GetPythonExe}; Parameters: Demo_QuickGUI01.py; WorkingDir: {app}\Demos\gui +Name: {group}\GUI\Navi; Filename: {code:GetPythonExe}; Parameters: Demo_Navi.py; WorkingDir: {app}\Demos\gui + +Name: {group}\ODE Demos\Multiple Scenes; Filename: {code:GetPythonExe}; Parameters: Demo_Scenes.py; WorkingDir: {app}\Demos\OgreOde +Name: {group}\ODE Demos\Gran Turism; Filename: {code:GetPythonExe}; Parameters: GranTurismOgre.py; WorkingDir: {app}\Demos\OgreOde + +Name: {group}\OgreAL Demos\Basic Sound; Filename: {code:GetPythonExe}; Parameters: Demo_RenderToTexture.py; WorkingDir: {app}\Demos\OgreAL + +Name: {group}\OgreNewt Demos\Basics; Filename: {code:GetPythonExe}; Parameters: Demo01_TheBasics.py; WorkingDir: {app}\Demos\OgreNewt +Name: {group}\OgreNewt Demos\Joints; Filename: {code:GetPythonExe}; Parameters: Demo02_Joints.py; WorkingDir: {app}\Demos\OgreNewt +Name: {group}\OgreNewt Demos\Collision Callbacks; Filename: {code:GetPythonExe}; Parameters: Demo03_CollisionCallbacks.py; WorkingDir: {app}\Demos\OgreNewt +Name: {group}\OgreNewt Demos\Ray Casting; Filename: {code:GetPythonExe}; Parameters: Demo04_RayCasting.py; WorkingDir: {app}\Demos\OgreNewt +Name: {group}\OgreNewt Demos\Simple Vehicle; Filename: {code:GetPythonExe}; Parameters: Demo05_SimpleVehicle.py; WorkingDir: {app}\Demos\OgreNewt +Name: {group}\OgreNewt Demos\Simple Buoyancy; Filename: {code:GetPythonExe}; Parameters: Demo06_SimpleBuoyancy.py; WorkingDir: {app}\Demos\OgreNewt +Name: {group}\OgreNewt Demos\Custom Joints; Filename: {code:GetPythonExe}; Parameters: Demo07_CustomJoints.py; WorkingDir: {app}\Demos\OgreNewt +Name: {group}\OgreNewt Demos\Ragdoll; Filename: {code:GetPythonExe}; Parameters: Demo08_ragdoll.py; WorkingDir: {app}\Demos\OgreNewt + +Name: {group}\Video Demos\ffmpeg Video; Filename: {code:GetPythonExe}; Parameters: Demo_Video.py; WorkingDir: {app}\Demos\ffmpeg +Name: {group}\Video Demos\DirectShow Video; Filename: {code:GetPythonExe}; Parameters: Demo_Video.py; WorkingDir: {app}\Demos\dshow +Name: {group}\Video Demos\Theora Video; Filename: {code:GetPythonExe}; Parameters: Demo_Video.py; WorkingDir: {app}\Demos\theora + +Name: {group}\NxOgre\Download AGEIA drivers first; Filename: http://www.ageia.com/drivers/drivers.html +Name: {group}\NxOgre\Cakewalk; Filename: {code:GetPythonExe}; Parameters: Cakeframework.py; WorkingDir: {app}\Demos\nxogre +Name: {group}\NxOgre\Demo101; Filename: {code:GetPythonExe}; Parameters: Demo_101.py; WorkingDir: {app}\Demos\nxogre +Name: {group}\NxOgre\Demo102; Filename: {code:GetPythonExe}; Parameters: Demo_102.py; WorkingDir: {app}\Demos\nxogre +Name: {group}\NxOgre\Demo103; Filename: {code:GetPythonExe}; Parameters: Demo_103.py; WorkingDir: {app}\Demos\nxogre + +Name: {group}\Plib Demos\Networking - Server; Filename: {code:GetPythonExe}; Parameters: Demo_Server.py; WorkingDir: {app}\Demos\plib +Name: {group}\Plib Demos\Networking - Client; Filename: {code:GetPythonExe}; Parameters: Demo_Client.py; WorkingDir: {app}\Demos\plib +Name: {group}\Plib Demos\Sound; Filename: {code:GetPythonExe}; Parameters: Demo_Sound.py; WorkingDir: {app}\Demos\plib + +Name: {group}\OgreForests Demos\ogreoforests; Filename: {code:GetPythonExe}; Parameters: Demo_Forests.py; WorkingDir: {app}\Demos\ogreforests + +Name: {group}\Uninstall Python-Ogre; Filename: {uninstallexe} +Name: {group}\Python-Ogre API Documenatation; Filename: {app}\docs\Python-Ogre.chm +;Name: {group}\Python-Ogre API (Html); Filename: {app}\docs\html\index.html + +[Run] +Filename: {app}\ThirdParty\vcredist_x86.exe +Filename: {app}\ThirdParty\dxwebsetup.exe; Description: DirectX Installer; StatusMsg: You probably NEED to update your Directx Drivers; Flags: postinstall + +[Code] +var + Page: TInputOptionWizardPage; + NumPythonVersions : Integer; + PythonVersions : array of String; + PythonLocations : array of String; + PythonVersion : String; + DisplayedPythonWarning : Boolean; + SupportedVersions : array of String; + Debug : Boolean; + +function NoPythonFound(): Boolean; +begin + if NumPythonVersions = 0 then + Result := True + else + Result := False; +end; + + +function FoundPython ( ver: String ) : Boolean; +var + I : Integer; +begin + Result := False; + if NumPythonVersions = 0 then + Result := False + else + for I:=0 to GetArrayLength(PythonVersions)-1 do + if PythonVersions[I] = ver then Result := True; +end; + + +function FoundPythonIn ( ver: String; listin: array of String ) : Boolean; +var + I : Integer; +begin + Result := False; + if GetArrayLength(listin) = 0 then + Result := False + else + for I:=0 to GetArrayLength(listin)-1 do + if listin[I] = ver then Result := True; +end; + +function SelectedPython ( ver: String ) : Boolean; +var + I : Integer; +begin + if PythonVersion = ver then + Result := True + else + Result := False; +end; + +function IsSupportedVersion ( Param: String ) : Boolean; +var + I: Integer; +begin + Result := True; +// msgbox ('Checking Supported Versions ' + Param + IntToStr(GetArrayLength(SupportedVersions) ), mbInformation, MB_OK); + + for I:=0 to GetArrayLength(SupportedVersions)-1 do begin + if Param = SupportedVersions[i] then Result := True; +// msgbox ( 'Checked ' + SupportedVersions[i], mbInformation, MB_OK); + end; +end; + + +{ +Get the python versions -- we have to check two registry "areas" as python allows +the install to be "for everyone", or "just for me" which is a pain.. Further more +sometimes when you uninstall python it doesn't remove the registry entries so I +need to check the python executable exists as well +} +function GetInstalledPythonVersions() : Integer; + +var + i, count: Integer; + p: string; + Result1 : array of String; + tempv, templ : array of String; +begin + tempv := ['','']; + templ := ['','']; + count := 0; + RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'SOFTWARE\Python\PythonCore', Result1); + // if we have versions here process them + for i:=0 to GetArrayLength(Result1)-1 do + if IsSupportedVersion ( Result1[i] ) then begin // make sure we support it.. + if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Python\PythonCore\' + Result1[i] + '\InstallPath', '', p) then begin + if FileExists ( p + '\python.exe' ) then begin + tempv[count] := Result1[i]; + templ[count] := p; // save the location + count := count + 1; + end; + end; + end; + + + if count < 2 then begin // we've only found zero, or one version so far.. + // OK so we should now have all the valid versions listed in LOCAL_MACHINE + RegGetSubkeyNames(HKEY_CURRENT_USER, 'SOFTWARE\Python\PythonCore', Result1); + for i:=0 to GetArrayLength(Result1)-1 do + if not FoundPythonIn ( Result1[i], tempv ) then // check we don't already know about this version + if IsSupportedVersion (Result1[i]) then begin + if RegQueryStringValue(HKEY_CURRENT_USER, 'SOFTWARE\Python\PythonCore\' + Result1[i] + '\InstallPath', '', p) then begin + if FileExists ( p + '\python.exe' ) then begin + tempv[count] := Result1[i]; + templ[count] := p; + count := count + 1; + end; + end; + end; + + end; + for i:=0 to 1 do + if ( Length(tempv[i]) > 0 ) then begin + setarraylength ( PythonVersions, getarraylength (PythonVersions) + 1); + PythonVersions[getarraylength(PythonVersions)-1] := tempv[i]; + setarraylength ( PythonLocations, getarraylength (Pythonlocations) + 1); + PythonLocations[getarraylength(PythonLocations)-1] := templ[i]; + end; + + Result := GetArrayLength ( PythonVersions ); +end; + +function GetPythonInstallPath(Ver: String) : String; +var + I : Integer; +begin + Result := '' + for i:=0 to NumPythonVersions -1 do begin + if Ver = PythonVersions[i] then Result:= PythonLocations[i]; + end +end; + +function GetPythonSiteDir(Param: String) : String; +begin + Result := GetPythonInstallPath ( PythonVersion ) + 'Lib\site-packages'; +end; + +function GetPythonExe ( Param: String) : String; +begin + if NumPythonVersions > 0 then + Result := GetPythonInstallPath ( PythonVersion ) + '\python.exe' + else + Result := 'python.exe'; +end; + +function ShouldSkipPage(PageID: Integer): Boolean; +begin + Result := False; + if PageID = Page.ID then begin + if NumPythonVersions = 1 then + Result := True; + if NumPythonVersions = 0 then begin + if DisplayedPythonWarning = False then + MsgBox('Unable to Find Python - will install all versions - "python setup.py install" will need to be run', mbInformation, MB_OK); + DisplayedPythonWarning := True; + Result := True; + end; + end; +end; + + +function NextButtonClick(PageID: Integer): Boolean; +begin + Result := True; + if PageID = Page.ID then + PythonVersion := PythonVersions[Page.SelectedValueIndex] +end; + +function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; +begin + Result:= 'Python-Ogre is about to be installed....' + NewLine + NewLine + + 'Tools, demos, and documentation will be installed to:' + NewLine + + Space + ExpandConstant('{app}') + NewLine + NewLine; + if NoPythonFound then begin + Result := Result + 'Python was not found so the python modules will' + NewLine + + Space + 'be installed under ' + ExpandConstant('{app}') +'.' + NewLine + + Space + 'You will need to run "python setup.py install" to install the modules' + + NewLine + NewLine + + Space + 'The program links will probably be broken as Python was not found'; + end else begin + Result := Result + 'Python Modules will be installed to:' + NewLine + + Space + GetPythonSiteDir ( PythonVersion ) + NewLine; + end; +end; +{ we have an issue that sometimes the older python ogre is not uninstalled or completely +deleted by out predelete file lists -- probably because a file has been added etc +This is OK except it leave the module directory with the wrong name so we need to fix this +} +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssInstall then begin + if DirExists ( GetPythonSiteDir('') + '\Ogre' ) then begin + RenameFile ( GetPythonSiteDir('') + '\Ogre', GetPythonSiteDir('') + '\ogre' ); + end; + end; +end; + +procedure InitializeWizard(); +var + I: Integer; +begin + + DisplayedPythonWarning := False; + PythonVersion := ''; + SupportedVersions := ['2.4', '2.5']; + Debug := False; + + NumPythonVersions := GetInstalledPythonVersions(); + if Debug then + msgbox ('Number Of Python Versions is ' + InttoStr( NumPythonVersions), mbInformation, MB_OK); + if NumPythonVersions = 1 then + PythonVersion := PythonVersions[0]; + if Debug then + msgbox ('Using python version ' + PythonVersion, mbInformation, MB_OK); + + Page := CreateInputOptionPage(wpLicense, + 'Select Python Version', 'Multiple Version of Python Found - Select one', + 'Please select the version of Python you would like to have Python-Ogre installed for..', + True, False); + if NumPythonVersions > 0 then begin + for I:=0 to GetArrayLength(PythonVersions)-1 do begin + Page.Add ('Python Version ' + PythonVersions[I] ); + Page.Values[I] := False; + end; + Page.Values[I-1] := True; + end + + +end; Modified: trunk/python-ogre/SConstruct =================================================================== --- trunk/python-ogre/SConstruct 2007-10-05 04:16:07 UTC (rev 408) +++ trunk/python-ogre/SConstruct 2007-10-05 08:20:21 UTC (rev 409) @@ -91,16 +91,16 @@ possible_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ 'ogreode', 'ogreal', 'quickgui', 'opcode', 'nxogre', 'bullet', 'physx', 'betagui','theora',\ 'ogrevideoffmpeg', 'ogredshow', 'plib', 'ogrebulletc', 'ogrebulletd', - 'ogreforests', 'et' ] # , 'raknet', 'navi', + 'ogreforests', 'et', 'navi' ] # , 'raknet' default_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ 'ogreode', 'ogreal', 'quickgui', 'opcode', 'nxogre', 'bullet', 'physx', 'betagui','theora',\ 'ogrevideoffmpeg', 'ogredshow', 'plib', 'ogrebulletc', 'ogrebulletd', - 'ogreforests', 'et' ] # 'navi', + 'ogreforests', 'et'] # 'navi', # This lets you call scons like: 'scons PROJECTS=ogre,cegui' opts = Options('custom.py') opts.Add(ListOption('PROJECTS', 'Project to build wrappers for', - possible_projects, default_projects)) + default_projects, possible_projects )) temp_env = Environment(options = opts) tobuild = temp_env['PROJECTS'] del temp_env Deleted: trunk/python-ogre/SConstruct.vc8 =================================================================== --- trunk/python-ogre/SConstruct.vc8 2007-10-05 04:16:07 UTC (rev 408) +++ trunk/python-ogre/SConstruct.vc8 2007-10-05 08:20:21 UTC (rev 409) @@ -1,163 +0,0 @@ -#! /usr/bin/python -# Copyright 2007 - Python-Ogre Project -# Based upon code from Lakin Wecker (2006) -# -## -## This file should be located in the root dir -## - -## some more goes here - -_LOGGING_ON = True - -def log ( instring ): - if _LOGGING_ON: - print instring - -import os -import sys -import environment - -# -# list the modules here you want to build -# The names must match those in environment.projects -# -#tobuild = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui'] -#tobuild = ['ode'] - -if os.name=='nt': - builddir = "c:/temp/build_dir" + "_" + environment.PythonVersionString -else: - builddir = "build_dir" + "_" + environment.PythonVersionString - -def create_SConscript ( cls ): - fname = os.path.join( cls._source, 'SConscript') - if os.path.isfile ( fname ): - log ("WARNING: Over-Writing %s as it already exists" % (fname)) - ## return ## uncomment this if you have manually created a Sconscript file.. - - f = open ( fname , 'w' ) - if os.sys.platform <> 'darwin': - targettype = 'SharedLibrary' - else: - targettype = 'LoadableModule' - f.write (""" -Import(\'_env\') \n -_%(name)s = _env.%(targettype)s( "%(name)s", SHLIBPREFIX=\'\', source=_env["FILES"])\n -Return ('_%(name)s')\n - """ % { 'name':cls._name, 'targettype':targettype } ) - -def get_ccflags(): - if os.name=='nt': - CCFLAGS='' - #CCFLAGS += '-DBOOST_PYTHON_MAX_ARITY=19' - CCFLAGS += ' /nologo' # -Zm800 - CCFLAGS += ' /W3 /wd4675' # warning level -Zc:wchar_t - CCFLAGS += ' /TP /MD /Zc:forScope /EHs /c' - ##CCFLAGS += ' /Ogisyb2 /Gs /GR ' #/Op /Ox /O2 - CCFLAGS += ' /Ox /Ob2 /Oi /Ot /Oy /GS- /GR ' - elif os.name =='posix': - if os.sys.platform <> 'darwin': - CCFLAGS = ' `pkg-config --cflags OGRE` ' - CCFLAGS += ' -I' - CCFLAGS += ' -O3 -I./ -fvisibility=hidden -finline-limit=20 ' - CCFLAGS += ' -DOGRE_GCC_VISIBILITY ' # -fvisibility-inlines-hidden - else: - CCFLAGS = ' -I -pipe -Os -I./' - return CCFLAGS - -def get_source_files(_dir): - try: - source_files = filter( lambda s: s.endswith( '.cpp' ), os.listdir(_dir) ) - except OSError,e: - print 'WARNING: Generate the sources this directory: "%s"' % _dir - raise e - source_files.sort() - return source_files ## "Image.pypp.cpp" ##source_files - -def get_linkflags(): - if os.name=='nt': - #LINKFLAGS = " -NOLOGO -INCREMENTAL:NO -DLL -OPT:NOREF -subsystem:console " # no change - LINKFLAGS = " /NOLOGO /OPT:REF /INCREMENTAL:NO /DLL /OPT:ICF /OPT:NOWIN98 /subsystem:console " # 7 minutes 25% smaller 16.6 Meg - #LINKFLAGS = " /NOLOGO /INCREMENTAL:NO /DLL /subsystem:console " ### LONG Link , 80 minutes - 15.7 meg - elif os.name == 'posix': - if os.sys.platform <> 'darwin': - LINKFLAGS = ' `pkg-config --libs OGRE` --strip-all -lstdc++ ' - else: - LINKFLAGS = '' - return LINKFLAGS - -# Let us select the projects to build -possible_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ - 'ogreode', 'ogreal', 'quickgui' ] ## 'betagui'] # , 'raknet' -default_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ - 'ogreode', 'ogreal', 'quickgui' ] ##'betagui'] - -# This lets you call scons like: 'scons PROJECTS=ogre,cegui' -opts = Options('custom.py') -opts.Add(ListOption('PROJECTS', 'Project to build wrappers for', - possible_projects, default_projects)) -temp_env = Environment(options = opts) -tobuild = temp_env['PROJECTS'] -del temp_env - - -for name, cls in environment.projects.items(): - ##if name.active: - if name in tobuild: - log ("Building " + name) - - ## setup some defaults etc - cls._source = cls.generated_dir - cls._build_dir = os.path.join ( builddir, cls.dir_name) - cls._name = name - _env = Environment(ENV=os.environ) - - ## Use custom compilier if wanted (things like ccache) - if hasattr(environment, 'cxx_compiler'): - _env['CXX'] = environment.cxx_compiler - if hasattr(environment, 'cc_compiler'): - _env['CC'] = environment.cc_compiler - - ## setup linker paths/libs and flags (standard and additional) - _env.Append ( LIBPATH= cls.lib_dirs + [environment.python_lib_dirs] ) - linkflags=get_linkflags() - if hasattr ( cls, 'LINKFLAGS' ): - linkflags += cls.LINKFLAGS - _env.Append( LINKFLAGS=linkflags ) - _env.Append ( LIBS = cls.libs ) - - ## setup compile paths and flags (standard and additional) - _env.Append ( CPPPATH = cls.include_dirs + [environment.python_include_dirs, environment.Config.PATH_Boost] ) - ccflags= get_ccflags() - if hasattr( cls, 'CCFLAGS'): - ccflags += cls.CCFLAGS - _env.Append ( CCFLAGS=ccflags ) - - ## create a list of source files to include - _env.Append ( FILES= get_source_files(cls._source) ) - ##cls._env = _env.Copy() ## NOT sure this is needed... - - ## build it to somewhere else - _env.BuildDir(cls._build_dir, os.path.join( environment.generated_dir_name, cls.dir_name ), duplicate=0) - ##cls._env.BuildDir(cls._build_dir, os.path.join( environment.generated_dir_name, cls.dir_name ), duplicate=0) - - ## create a dynamic Sconscript file in the source directory (only if it doesn't exist) - create_SConscript ( cls ) -# # _env.LINKCOM = [_env['LINKCOM'],\ -# # 'mt.exe -nologo -manifest %(name)s.manifest -outputresource:%(name)s;2' % {'name':cls._name} ] - ## now call the SConscript file in the source directory - Export ( '_env' ) - package = _env.SConscript(os.path.join( cls._build_dir, 'SConscript' ) ) - - ## ugly hack - scons returns a list of targets from SharedLibrary - we have to choose the one we want - index = 0 # this is the index into a list of targets - '0' should be the platform default - - ## and lets have it install the output into the 'package_dir_name/ModuleName' dir and rename to the PydName - _env.AddPostAction(package,\ - 'mt.exe -nologo -manifest %(name)s.manifest -outputresource:%(name)s;2' % { 'name':package[index] } ) - - _env.InstallAs(os.path.join(environment.package_dir_name, cls.parent, - cls.ModuleName, cls.PydName), - package[index] ) - Modified: trunk/python-ogre/code_generators/common_utils/__init__.py =================================================================== --- trunk/python-ogre/code_generators/common_utils/__init__.py 2007-10-05 04:16:07 UTC (rev 408) +++ trunk/python-ogre/code_generators/common_utils/__init__.py 2007-10-05 08:20:21 UTC (rev 409) @@ -343,4 +343,63 @@ """ for className in ImplicitClasses: mb.class_(className).constructors().allow_implicit_conversion = True - \ No newline at end of file + +def Fix_ReadOnly_Vars ( main_ns, ToFixClasses, knownNonMutable ): + """ find read only variables that are "python" mutable, exclude them, add a getter function + and expose them using properties -- this ensures a copy is made of the variable, otherwise you get a pointer + to the original 'readonly' C++ variable AND CAN CHANGE IT :( -- it acts like a normal static variable + which can cause interersting things to go wrong.. + """ + + GetterFunction = \ + """ + // special function to replace an existing read only variable as + // we need to make a copy of the variable as python doesn't understand 'const' + typedef const %(return_type)s ( *fget_Special_%(variable_name)s )(%(class_type)s &); + %(return_type)s %(getter_name)s ( %(class_type)s & me ) { + return me.%(variable_name)s; + } + """ + GetterReg = \ + """ + add_property( // special :) + "%(variable_name)s_Copy" + , fget_Special_%(variable_name)s ( &%(getter_name)s ) + , "special get property, built to access const variable" ) + """ +# ## fix -- the implementation above isn't really what I wanted :) +# GetterFunction = \ +# """ +# // special function to replace an existing read only variable as +# // we need to make a copy of the variable as python doesn't understand 'const' +# typedef const %(return_type)s ( *fget_Special_%(variable_name)s )(); +# %(return_type)s %(getter_name)s ( ) { +# return ::%(class_type)s::%(variable_name)s; +# } +# """ + + for cls in main_ns.classes(): + if cls.name in ToFixClasses: # force fixes in specific classes + for v in cls.variables(allow_empty=True): + if v.is_read_only and v.exportable==True : # only if it's exposed.. + if type (v.type) == declarations.cpptypes.const_t: # only care about const's + known = False + for k in knownNonMutable: + if v.type.decl_string.startswith (k): + known = True + if not known: + ## OK so it must be mutable so lets fix it.. +# # # # v.exclude() ## remove it as a variable + return_type, ignore = v.type.decl_string.split(' ',1) # remove cont etc from decl + return_type = return_type[2:] # remove leading :: + variable_name = v.name + class_type = cls.decl_string[2:] # again don't need leading '::' + getter_name = variable_name + '_Getter_Copy' # define a non conflicting name + values = { 'return_type':return_type, 'variable_name':variable_name, + 'class_type':class_type, 'getter_name':getter_name } + # create the actual getter function + deccode = GetterFunction % values + cls.add_declaration_code( deccode ) + # and the property registration code + regcode = GetterReg % values + cls.add_registration_code( regcode ) Modified: trunk/python-ogre/code_generators/common_utils/extract_documentation.py =================================================================== --- trunk/python-ogre/code_generators/common_utils/extract_documentation.py 2007-10-05 04:16:07 UTC (rev 408) +++ trunk/python-ogre/code_generators/common_utils/extract_documentation.py 2007-10-05 08:20:21 UTC (rev 409) @@ -245,4 +245,4 @@ print doc_extractor("")(x_decl("myfunc(int x, int y)","c:/development/ocvs/ogrenew/ogremain/include/OgreSceneManager.h",218)) print doc_extractor("")(x_decl("","c:/development/ocvs/ogrenew/ogremain/include/OgreSceneManager.h",223)) - print doc_extractor("")(x_decl("","c:/development/CEGUI-0.5.0/include/CEGUIEvent.h",139)) + print doc_extractor("")(x_decl("","c:/development/CEGUI-0.5.0/include/CEGUIEvent.h",139)) \ No newline at end of file Added: trunk/python-ogre/code_generators/navi/Navi.h =================================================================== --- trunk/python-ogre/code_generators/navi/Navi.h (rev 0) +++ trunk/python-ogre/code_generators/navi/Navi.h 2007-10-05 08:20:21 UTC (rev 409) @@ -0,0 +1,169 @@ +/* + This file is part of Navi, a library that allows developers to embed movable + 'Navis' (Dynamic, HTML/JS/CSS-Driven GUI Overlays) within an Ogre3D application. + + Copyright (C) 2007 Adam J. Simmons + http://www.agelessanime.com/Navi/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __Navi_H__ +#define __Navi_H__ +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "NaviPlatform.h" +#include "NaviManager.h" +#include <llmozlib.h> + +namespace NaviLibrary +{ + /** + * This class is pure private, Navi objects are solely handled by NaviManager + */ + class _NaviExport Navi : public LLEmbeddedBrowserWindowObserver, public Ogre::WindowEventListener, public Ogre::ManualResourceLoader + { + friend class NaviManager; + friend class NaviCompare; + + std::string naviName; + unsigned short naviWidth; + unsigned short naviHeight; + unsigned int winWidth; + unsigned int winHeight; + Ogre::RenderWindow* renderWindow; + bool isWinFocused; + NaviPosition position; + bool movable; + int windowID; + Ogre::Overlay* overlay; + Ogre::PanelOverlayElement* panel; + bool needsUpdate; + unsigned int maxUpdatePS; + bool forceMax; + Ogre::Timer timer; + unsigned long lastUpdateTime; + float opacity; + bool usingMask; + bool ignoringTrans; + float transparent; + bool usingColorKeying; + float keyFuzziness; + unsigned char keyR, keyG, keyB; + float keyFOpacity; + unsigned char keyFillR, keyFillG, keyFillB; + unsigned char* naviCache; + bool isMaterialOnly; + std::vector<NaviEventListener*> eventListeners; +// std::multimap<std::string, NaviDelegate> delegateMap; +// std::multimap<std::string, NaviDelegate>::iterator delegateIter; +// std::pair<std::multimap<std::string, NaviDelegate>::iterator, std::multimap<std::string, NaviDelegate>::iterator> dmBounds; + std::map<std::string, std::vector<std::string> > ensureKeysMap; + std::map<std::string, std::vector<std::string> >::iterator ensureKeysMapIter; + bool okayToDelete; + bool isVisible; + bool fadingOut; + unsigned long fadingOutStart; + unsigned long fadingOutEnd; + bool fadingIn; + unsigned long fadingInStart; + unsigned long fadingInEnd; + bool compensateNPOT; + unsigned short texWidth; + unsigned short texHeight; + size_t texPixelSize; + size_t texPitch; + + + Navi(Ogre::RenderWindow* renderWin, std::string name, std::string homepage, const NaviPosition &naviPosition, + unsigned short width, unsigned short height, bool isMovable, bool visible, unsigned int maxUpdatesPerSec, bool forceMaxUpdate, unsigned short zOrder, float _opacity); + + Navi(Ogre::RenderWindow* renderWin, std::string name, std::string homepage, unsigned short width, unsigned short height, bool visible, + unsigned int maxUpdatesPerSec, bool forceMaxUpdate, float _opacity, Ogre::FilterOptions texFiltering); + + ~Navi(); + + void createOverlay(unsigned short zOrder); + + void createBrowser(Ogre::RenderWindow* renderWin, std::string homepage); + + void createMaterial(Ogre::FilterOptions texFiltering = Ogre::FO_NONE); + + void setMask(std::string maskFileName, std::string groupName); + + void update(); + + void loadResource(Ogre::Resource* resource); + + void moveNavi(int deltaX, int deltaY); + + void navigateTo(std::string url); + + void navigateTo(std::string url, NaviData naviData); + + std::string evaluateJS(const std::string &script); + + void addEventListener(NaviEventListener* newListener); + + void removeEventListener(NaviEventListener* removeListener); + +// void bind(const std::string &naviDataName, const NaviDelegate &callback, const std::vector<std::string> &keys); + +// void unbind(const std::string &naviDataName, const NaviDelegate &callback = NaviDelegate()); + + void setBackgroundColor(float red, float green, float blue); + + void setOpacity(float _opacity); + + void setIgnoreTransparentAreas(bool ignoreTrans, float defineThreshold); + + void setColorKey(const std::string &keyColor, float keyFillOpacity = 0.0, const std::string &keyFillColor = "#000000", float keyFuzzy = 0.0); + + void setDefaultPosition(); + + void hide(bool fade, unsigned short fadeDurationMS); + + void show(bool fade, unsigned short fadeDurationMS); + + bool isPointOverMe(int x, int y); + + bool isPointWithin(int x, int y, int left, int right, int top, int bottom); + + bool isPointOpaqueEnough(int x, int y); + + int getRelativeX(int absX); + + int getRelativeY(int absY); + + void onPageChanged(const EventType& eventIn); + void onNavigateBegin(const EventType& eventIn); + void onNavigateComplete(const EventType& eventIn); + void onUpdateProgress(const EventType& eventIn); + void onStatusTextChange(const EventType& eventIn); + void onLocationChange(const EventType& eventIn); + void onClickLinkHref(const EventType& eventIn); + + void windowMoved(Ogre::RenderWindow* rw); + void windowResized(Ogre::RenderWindow* rw); + void windowClosed(Ogre::RenderWindow* rw); + void windowFocusChange(Ogre::RenderWindow* rw); + + }; + +} + +#endif \ No newline at end of file Added: trunk/python-ogre/code_generators/navi/NaviManager.h =================================================================== --- trunk/python-ogre/code_generators/navi/NaviManager.h (rev 0) +++ trunk/python-ogre/code_generators/navi/NaviManager.h 2007-10-05 08:20:21 UTC (rev 409) @@ -0,0 +1,754 @@ +/* + This file is part of Navi, a library that allows developers to embed movable + 'Navis' (Dynamic, HTML/JS/CSS-Driven GUI Overlays) within an Ogre3D application. + + Copyright (C) 2007 Adam J. Simmons + http://www.agelessanime.com/Navi/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __NaviManager_H__ +#define __NaviManager_H__ +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "NaviPlatform.h" +#include "NaviData.h" +#include "NaviEventListener.h" +#include "NaviMouse.h" +//#include "NaviDelegate.h" +#include "NaviUtilities.h" +#include "NaviSingleton.h" +#include <OgrePanelOverlayElement.h> + +namespace NaviLibrary +{ + struct NaviCompare; + + /** + * Enumerates relative positions. Used by NaviManager::NaviPosition + */ + enum RelativePosition + { + Left, + TopLeft, + TopCenter, + TopRight, + Right, + BottomRight, + BottomCenter, + BottomLeft, + Center + }; + + /** + * An object that holds position-data for a Navi. Used by NaviManager::createNavi and NaviManager::setNaviPosition. + */ + class _NaviExport NaviPosition + { + bool usingRelative; + union { + struct { RelativePosition position; short x; short y; } rel; + struct { short left; short top; } abs; + } data; + + friend class Navi; + NaviPosition(); + public: + /** + * Creates a relatively-positioned NaviPosition object. + * + * @param relPosition The position of the Navi in relation to the Render Window + * + * @param offsetLeft How many pixels from the left to offset the Navi from the relative position. + * + * @param offsetTop How many pixels from the top to offset the Navi from the relative position. + */ + NaviPosition(const RelativePosition &relPosition, short offsetLeft = 0, short offsetTop = 0); + + /** + * Creates an absolutely-positioned NaviPosition object. + * + * @param absoluteLeft The number of pixels from the left of the Render Window. + * + * @param absoluteTop The number of pixels from the top of the Render Window. + */ + NaviPosition(short absoluteLeft, short absoluteTop); + }; + + /** + * Enumerates internal mouse button IDs. Used by NaviManager::injectMouseDown, NaviManager::injectMouseUp + */ + enum MouseButtonID + { + LeftMouseButton = 0, + RightMouseButton, + MiddleMouseButton + }; + + /** + * Supreme dictator and Singleton: NaviManager + * + * The class you will need to go to for all your Navi-related needs. + */ + class _NaviExport NaviManager : public Singleton<NaviManager> + { + friend class Navi; // Our very close friend <3 + friend void NaviUtilities::translateLocalProtocols(std::string &strToTranslate); + + bool startedUp; + std::string localNaviDirectory; + std::map<std::string,Navi*> activeNavis; + std::vector<Navi*> boundaryIgnorers; + Navi* focusedNavi; + int hiddenWindowID; + std::map<std::string,Navi*>::iterator iter; + std::vector<Navi*>::iterator bIter; + Ogre::RenderWindow* renderWindow; + int mouseXPos, mouseYPos; + bool mouseButtonRDown; + unsigned short zOrderCounter; + NaviMouse* mouse; + + void focusNavi(int x, int y, Navi* selection = 0); + const std::vector<Navi*>& getNavisAtPoint(int x, int y); + const std::vector<Navi*>& getNavis(); + public: + /** + * Creates the NaviManager and loads the internal LLMozLib library. + * + * @param _renderWindow The Ogre::RenderWindow to render Navis to + * + * @param _localNaviDirectory By default, "local://" means something like: + * "C:\MyApplicationDirectory\NaviLocal\" but by changing + * this parameter, you can change "NaviLocal" to something else. + * + * @throws Ogre::Exception::ERR_INTERNAL_ERROR Throws this when LLMozLib fails initialization + */ + NaviManager(Ogre::RenderWindow* _renderWindow, const std::string &_localNaviDirectory = "NaviLocal"); + + ~NaviManager(); + + /** + * Gets the NaviManager Singleton. + * + * @return A reference to the NaviManager Singleton. + * + * @throws Ogre::Exception::ERR_RT_ASSERTION_FAILED Throws this if NaviManager has not been new'd yet. + */ + static NaviManager& Get(); + + /** + * Gets the NaviManager Singleton as a pointer. + * + * @return A pointer to the NaviManager Singleton. + * + * @throws Ogre::Exception::ERR_RT_ASSERTION_FAILED Throws this if NaviManager has not been new'd yet. + */ + static NaviManager* GetPointer(); + + /** + * Starts up the NaviMouse singleton and returns a pointer to it. + * + * @param visible Whether or not the NaviMouse is visible. Use NaviMouse::show()/hide() later. + */ + NaviMouse* StartupMouse(bool visible = true); + + /** + * Returns the NaviMouse singleton. + * + * @throws Ogre::Exception::ERR_RT_ASSERTION_FAILED Throws this if StartupMouse() is not called prior. + */ + NaviMouse* getMouse(); + + /** + * Gives each active Navi a chance to update, each may or may not update their internal textures + * based on various conditions. + */ + void Update(); + + /** + * Destroys any active Navis and shuts down the LLMozLib library. + */ + void Shutdown(); + + /** + * Creates a Navi. (You MUST call Startup() before this.) + * + * @param naviName The name of the Navi, used to refer to a specific Navi in subsequent calls. + * + * @param homepage The default starting page for a Navi. You may use local:// here to refer to + * the local Navi directory (See NaviManager::Startup) + * + * @param naviPosition The unified position (either relative or absolute) of a Navi. + * See NaviManager::NaviPosition for more information. + * + * @param width The width of the Navi. MUST be a power of 2 (e.g. 128, 256, 512, 1024) + * Technically you may be able to use a number that is divisible by 16 but + * please be mindful of the 2^n texture size limitation of certain video cards + * + * @param height The height of the Navi. MUST be a power of 2 (e.g. 128, 256, 512, 1024) + * Technically you may be able to use a number that is divisible by 16 but + * please be mindful of the 2^n texture size limitation of certain video cards + * + * @param isMovable Whether or not this absolutely positioned Navi is movable (right-click-drag to move) + * + * @param isVisible Whether or not this Navi is visible upon creation. Use NaviManager::showNavi to display + * this Navi later. + * + * @param maxUpdatesPerSec This parameter limits the number of updates per second to a specific + * integer. To use no limiting, leave this parameter as '0'. This limiting is + * useful if, for example, you had some very hyperactive Javascript + * that animated a moving ball. Without update limiting, Navi will try to update + * itself at every possible moment: this is great for very smooth animation but + * bad for the overall framerate. + * + * @param forceMaxUpdate Navi normally only updates when the page has changed, to override this functionality + * set this parameter to 'True' to make Navi 'force update' using the value of the + * parameter 'maxUpdatesPerSec'. This is useful as a work-around for rendering embedded + * Flash applications. Note: if 'maxUpdatesPerSec' is 0, Navi will try to 'force update' + * every single chance it gets (not recommended). + * + * @param zOrder Sets the starting Z-Order for this Navi; Navis with higher Z-Orders will be on top of other + * Navis. To auto-increment this value for every successive Navi, leave this parameter as '0'. + * + * @param opacity Sets the starting Opacity of the Navi. + * Ex. 1.0000 = Fully opaque + * Ex. 0.5000 = Half opaque + * Ex. 0.0000 = Totally transparent + * + * @throws Ogre::Exception::ERR_RT_ASSERTION_FAILED Throws this if NaviManager::Startup is not called prior to this. + */ + void createNavi(const std::string &naviName, const std::string &homepage, const NaviPosition &naviPosition, + unsigned short width, unsigned short height, bool isMovable = true, bool isVisible = true, unsigned int maxUpdatesPerSec = 48, bool forceMaxUpdate = false, + unsigned short zOrder = 0, float opacity = 1.0); + + /** + * Creates a NaviMaterial. (You MUST call Startup() before this.) NaviMaterials are just like Navis except that they lack + * a movable overlay element. Instead, you handle the material and apply it to anything you like. Mouse input for NaviMaterials + * must be injected using the 'injectNaviMaterial...(...)' API calls. + * + * @param naviName The name of the NaviMaterial, used to refer to this specific Navi in subsequent calls. + * + * @param homepage The default starting page for a Navi. You may use local:// here to refer to + * the local Navi directory (See NaviManager::Startup) + * + * @param width The width of the NaviMaterial. MUST be a power of 2 (e.g. 128, 256, 512, 1024) + * Technically you may be able to use a number that is divisible by 16 but + * please be mindful of the 2^n texture size limitation of certain video cards + * + * @param height The height of the NaviMaterial. MUST be a power of 2 (e.g. 128, 256, 512, 1024) + * Technically you may be able to use a number that is divisible by 16 but + * please be mindful of the 2^n texture size limitation of certain video cards + * + * @param isVisible Whether or not this NaviMaterial is visible or not (0% opacity, non-updated). Use + * NaviManager::showNavi to display this NaviMaterial later. + * + * @param maxUpdatesPerSec This parameter limits the number of updates per second to a specific + * integer. To use no limiting, leave this parameter as '0'. This limiting is + * useful if, for example, you had some very hyperactive Javascript + * that animated a moving ball. Without update limiting, Navi will try to update + * itself at every possible moment: this is great for very smooth animation but + * bad for the overall framerate. + * + * @param forceMaxUpdate Navi normally only updates when the page has changed, to override this functionality + * set this parameter to 'True' to make Navi 'force update' using the value of the + * parameter 'maxUpdatesPerSec'. This is useful as a work-around for rendering embedded + * Flash applications. Note: if 'maxUpdatesPerSec' is 0, Navi will try to 'force update' + * every single chance it gets (not recommended). + * + * @param opacity Sets the starting Opacity of the Navi. + * Ex. 1.0000 = Fully opaque + * Ex. 0.5000 = Half... [truncated message content] |
From: <and...@us...> - 2007-10-05 04:16:05
|
Revision: 408 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=408&view=rev Author: andy_miller Date: 2007-10-04 21:16:07 -0700 (Thu, 04 Oct 2007) Log Message: ----------- Initial version of Editable Terrain wrapper -- thanks Dermont Updated QuickGUI Modified Paths: -------------- trunk/python-ogre/PythonOgreConfig_nt.py trunk/python-ogre/PythonOgreConfig_posix.py trunk/python-ogre/SConstruct trunk/python-ogre/ThirdParty/quickgui/QuickGUIBorder.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIBorder.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIButton.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIButton.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIComboBox.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIComboBox.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalScrollBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalScrollBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalTrackBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIHorizontalTrackBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIImage.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIImage.h trunk/python-ogre/ThirdParty/quickgui/QuickGUILabel.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUILabel.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIListItem.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIListItem.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenu.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenu.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenuList.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIMenuList.h trunk/python-ogre/ThirdParty/quickgui/QuickGUINStateButton.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUINStateButton.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIPanel.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIPanel.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIProgressBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIProgressBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuadContainer.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIScrollPane.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIScrollPane.h trunk/python-ogre/ThirdParty/quickgui/QuickGUISheet.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUISheet.h trunk/python-ogre/ThirdParty/quickgui/QuickGUISize.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIText.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIText.h trunk/python-ogre/ThirdParty/quickgui/QuickGUITextBox.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUITextBox.h trunk/python-ogre/ThirdParty/quickgui/QuickGUITitleBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUITitleBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalScrollBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalScrollBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalTrackBar.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIVerticalTrackBar.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIWindow.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIWindow.h trunk/python-ogre/environment.py trunk/python-ogre/setup.py Added Paths: ----------- trunk/python-ogre/ThirdParty/et/ trunk/python-ogre/ThirdParty/et/ETBrush.cpp trunk/python-ogre/ThirdParty/et/ETBrush.h trunk/python-ogre/ThirdParty/et/ETIndexHandler.cpp trunk/python-ogre/ThirdParty/et/ETLightmap.cpp trunk/python-ogre/ThirdParty/et/ETLoadSaveHeightmap.cpp trunk/python-ogre/ThirdParty/et/ETPrerequisites.h trunk/python-ogre/ThirdParty/et/ETSplattingManager.cpp trunk/python-ogre/ThirdParty/et/ETSplattingManager.h trunk/python-ogre/ThirdParty/et/ETTerrainInfo.cpp trunk/python-ogre/ThirdParty/et/ETTerrainInfo.h trunk/python-ogre/ThirdParty/et/ETTerrainManager.cpp trunk/python-ogre/ThirdParty/et/ETTerrainManager.h trunk/python-ogre/ThirdParty/et/ETTile.cpp trunk/python-ogre/ThirdParty/et/Impl/ trunk/python-ogre/ThirdParty/et/Impl/ETIndexHandler.h trunk/python-ogre/ThirdParty/et/Impl/ETOptions.h trunk/python-ogre/ThirdParty/et/Impl/ETTerrainImpl.h trunk/python-ogre/ThirdParty/et/Impl/ETTile.h trunk/python-ogre/code_generators/et/ trunk/python-ogre/code_generators/et/customization_data.py trunk/python-ogre/code_generators/et/generate_code.py trunk/python-ogre/code_generators/et/hand_made_wrappers.py trunk/python-ogre/code_generators/et/python_et.h trunk/python-ogre/code_generators/et/python_et_aliases.h trunk/python-ogre/code_generators/et/python_et_sizeof.h trunk/python-ogre/demos/et/ trunk/python-ogre/demos/et/CEGUI_framework.py trunk/python-ogre/demos/et/Demo_CEGUI_ET.py trunk/python-ogre/demos/et/SampleFramework.py trunk/python-ogre/demos/et/minimap.material trunk/python-ogre/demos/et/minimap.overlay trunk/python-ogre/demos/et/plugins.cfg trunk/python-ogre/demos/et/resources.cfg Modified: trunk/python-ogre/PythonOgreConfig_nt.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-03 06:30:20 UTC (rev 407) +++ trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-05 04:16:07 UTC (rev 408) @@ -41,6 +41,7 @@ PATH_betagui= os.path.join(PATH_THIRDPARTY,'betagui') PATH_ogredshow = os.path.join(PATH_THIRDPARTY,'dshow') PATH_plib = os.path.join(PATH_THIRDPARTY, 'plib') +PATH_et = os.path.join(PATH_THIRDPARTY, 'et') PATH_ogrevideoffmpeg = os.path.join(PATH_THIRDPARTY,'ffmpeg') PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.62') Modified: trunk/python-ogre/PythonOgreConfig_posix.py =================================================================== --- trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-03 06:30:20 UTC (rev 407) +++ trunk/python-ogre/PythonOgreConfig_posix.py 2007-10-05 04:16:07 UTC (rev 408) @@ -48,6 +48,8 @@ PATH_betagui= os.path.join(PATH_THIRDPARTY,'betagui') PATH_ogredshow = os.path.join(PATH_THIRDPARTY,'dshow') PATH_plib = os.path.join(PATH_THIRDPARTY, 'plib') +PATH_et = os.path.join(PATH_THIRDPARTY, 'et') + PATH_ogrevideoffmpeg = os.path.join(PATH_THIRDPARTY,'ffmpeg') PATH_NxOgre= os.path.join(BASE_DIR, 'nxogre/NxOgre') PATH_Bullet= os.path.join(BASE_DIR, 'bullet-2.62') Modified: trunk/python-ogre/SConstruct =================================================================== --- trunk/python-ogre/SConstruct 2007-10-03 06:30:20 UTC (rev 407) +++ trunk/python-ogre/SConstruct 2007-10-05 04:16:07 UTC (rev 408) @@ -91,11 +91,11 @@ possible_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ 'ogreode', 'ogreal', 'quickgui', 'opcode', 'nxogre', 'bullet', 'physx', 'betagui','theora',\ 'ogrevideoffmpeg', 'ogredshow', 'plib', 'ogrebulletc', 'ogrebulletd', - 'ogreforests' ] # , 'raknet', 'navi', + 'ogreforests', 'et' ] # , 'raknet', 'navi', default_projects = ['ogre' , 'ois', 'ogrerefapp', 'ogrenewt', 'cegui', 'ode',\ 'ogreode', 'ogreal', 'quickgui', 'opcode', 'nxogre', 'bullet', 'physx', 'betagui','theora',\ 'ogrevideoffmpeg', 'ogredshow', 'plib', 'ogrebulletc', 'ogrebulletd', - 'ogreforests' ] # 'navi', + 'ogreforests', 'et' ] # 'navi', # This lets you call scons like: 'scons PROJECTS=ogre,cegui' opts = Options('custom.py') Added: trunk/python-ogre/ThirdParty/et/ETBrush.cpp =================================================================== --- trunk/python-ogre/ThirdParty/et/ETBrush.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETBrush.cpp 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,131 @@ +/* +EDITABLE TERRAIN MANAGER for Ogre +Copyright (C) 2007 Holger Frydrych <h.f...@gm...> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. +*/ + +#include "ETBrush.h" + +#include <OgreImage.h> +#include <OgreException.h> + +using namespace std; +using namespace Ogre; +using Ogre::uint; +using Ogre::ushort; + +namespace ET +{ + Brush::Brush() + : mWidth(0), mHeight(0), mBrushArray(0) + { + } + + Brush::Brush(const float* brush, size_t width, size_t height) + : mWidth(width), mHeight(height) + { + mBrushArray = new float[width*height]; + memcpy(mBrushArray, brush, width*height*sizeof(float)); + } + + Brush::Brush(const vector<float>& brush, size_t width, size_t height) + : mWidth(width), mHeight(height) + { + mBrushArray = new float[width*height]; + copy(brush.begin(), brush.end(), mBrushArray); + } + + Brush::Brush(const Brush& other) + : mWidth(other.mWidth), mHeight(other.mHeight) + { + mBrushArray = new float[mWidth*mHeight]; + memcpy(mBrushArray, other.mBrushArray, mWidth*mHeight*sizeof(float)); + } + + Brush::~Brush() + { + delete[] mBrushArray; + } + + + Brush& Brush::operator=(const Brush& other) + { + Brush tmp (other); + tmp.swap(*this); + return *this; + } + + void Brush::swap(Brush& other) + { + std::swap(mWidth, other.mWidth); + std::swap(mHeight, other.mHeight); + std::swap(mBrushArray, other.mBrushArray); + } + + Brush loadBrushFromImage(const Image& image) + { + size_t width = image.getWidth(); + size_t height = image.getHeight(); + vector<float> brush (width*height); + + // determine the bytes per pixel used in the image + int bpp = int(image.getSize() / (width*height)); + /*switch (image.getFormat()) + { + case PF_BYTE_A: bpp = 1; break; + case PF_BYTE_LA: case PF_L16: bpp = 2; break; + case PF_BYTE_RGB: case PF_BYTE_BGR: bpp = 3; break; + case PF_BYTE_RGBA: case PF_BYTE_BGRA: bpp = 4; break; + default: OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Don't know what to do with the given image format, sorry.", "loadBrushFromImage"); + }*/ + // from the bpp, calculate the relevant max value for one pixel + uint maxValue = (1 << (bpp*8)) - 1; + + // now fill the brush array + const uchar* imageData = image.getData(); + for (size_t i = 0; i < brush.size(); ++i) + { + uint val = 0; + memcpy(&val, imageData, bpp); + imageData += bpp; + brush[i] = float(val) / maxValue; + } + + return Brush(brush, width, height); + } + + + void saveBrushToImage(const Brush& brush, Image& image) + { + // save brush as a 16bit grayscale image + ushort* data = new ushort[brush.getWidth()*brush.getHeight()]; + for (size_t x = 0; x < brush.getWidth(); ++x) + for (size_t y = 0; y < brush.getHeight(); ++y) + data[y*brush.getWidth() + x] = ushort(brush.at(x, y) * 0xffff); + + // pass the data to the image, image takes over ownership + image.loadDynamicImage((uchar*)data, brush.getWidth(), brush.getHeight(), 1, PF_L16, true); + } +} Added: trunk/python-ogre/ThirdParty/et/ETBrush.h =================================================================== --- trunk/python-ogre/ThirdParty/et/ETBrush.h (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETBrush.h 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,94 @@ +#ifndef __ETBRUSH_H__ +#define __ETBRUSH_H__ + +/* +EDITABLE TERRAIN MANAGER for Ogre +Copyright (C) 2007 Holger Frydrych <h.f...@gm...> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. +*/ + +#include "ETPrerequisites.h" + +#include <vector> + +// forward declarations +namespace Ogre +{ + class Image; +} + + +namespace ET +{ + /** This class represents a brush used to deform terrain or edit splatting coverage */ + class _ETManagerExport Brush + { + public: + /** Default constructor */ + Brush(); + /** Constructs a brush from a given array of floats */ + Brush(const float* brush, size_t width, size_t height); + /** Constructs a brush from a given vector of floats */ + Brush(const std::vector<float>& brush, size_t width, size_t height); + /** Copy constructor */ + Brush(const Brush& other); + ~Brush(); + + /** Copy assignment */ + Brush& operator=(const Brush& other); + + size_t getWidth() const { return mWidth; } + size_t getHeight() const { return mHeight; } + + /** Access to the brush array */ + float& at(size_t x, size_t y) + { + return mBrushArray[x + y*mWidth]; + } + /** Const access to the brush array */ + const float at(size_t x, size_t y) const + { + return mBrushArray[x + y*mWidth]; + } + + /** Exception-safe swap function */ + void swap(Brush& other); + + private: + /** The actual brush array containing the brush values */ + float* mBrushArray; // would have used vector<float>, but gives warnings with dll export + /** The brush's dimensions */ + size_t mWidth, mHeight; + }; + + /** Loads a brush from a grayscale image */ + Brush _ETManagerExport loadBrushFromImage(const Ogre::Image& image); + + /** Saves a brush to a grayscale image */ + void _ETManagerExport saveBrushToImage(const Brush& brush, Ogre::Image& image); +} + + +#endif Added: trunk/python-ogre/ThirdParty/et/ETIndexHandler.cpp =================================================================== --- trunk/python-ogre/ThirdParty/et/ETIndexHandler.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETIndexHandler.cpp 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,257 @@ +/* +EDITABLE TERRAIN MANAGER for Ogre +Copyright (C) 2007 Holger Frydrych <h.f...@gm...> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. +*/ + +#include "Impl/ETIndexHandler.h" + +#include <OgreHardwareBufferManager.h> + +using namespace Ogre; +using Ogre::uint; +using Ogre::ushort; + +namespace ET +{ + namespace Impl + { + IndexHandler::IndexHandler(size_t tileSize, unsigned int maxLOD) + : mTileSize(tileSize), mIndexes(maxLOD) + { + } + + IndexHandler::~IndexHandler() + { + for (size_t i = 0; i < mIndexes.size(); ++i) + { + for (IndexMap::iterator it = mIndexes[i].begin(); it != mIndexes[i].end(); ++it) + delete it->second; + } + } + + IndexData* IndexHandler::requestIndexData(unsigned int lod, unsigned int neighbourState) + { + assert(lod < mIndexes.size() && "Requested unexpected LOD level"); + IndexData* data; + IndexMap::iterator it = mIndexes[lod].find(neighbourState); + if (it != mIndexes[lod].end()) + data = it->second; + else + { + data = createIndexes(lod, neighbourState); + mIndexes[lod].insert(IndexMap::value_type(neighbourState, data)); + } + return data; + } + + + unsigned short IndexHandler::index(size_t x, size_t z) const + { + return ushort(x + z * mTileSize); + } + + + IndexData* IndexHandler::createIndexes(unsigned int lod, unsigned int neighbourState) + { + unsigned int numIndexes = 0; + unsigned int step = 1 << lod; + + unsigned int northLOD = neighbourState >> 24; + unsigned int eastLOD = (neighbourState >> 16) & 0xFF; + unsigned int southLOD = (neighbourState >> 8) & 0xFF; + unsigned int westLOD = neighbourState & 0xFF; + unsigned int north = northLOD ? step : 0; + unsigned int east = eastLOD ? step : 0; + unsigned int south = southLOD ? step : 0; + unsigned int west = westLOD ? step : 0; + + size_t newLength = (mTileSize/step) * (mTileSize/step) * 2 * 2 * 2; + IndexData* indexData = new IndexData; + indexData->indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer( + HardwareIndexBuffer::IT_16BIT, newLength, HardwareBuffer::HBU_STATIC_WRITE_ONLY); + unsigned short* pIdx = static_cast<unsigned short*>(indexData->indexBuffer->lock( + 0, indexData->indexBuffer->getSizeInBytes(), HardwareBuffer::HBL_DISCARD)); + + // go over all vertices and combine them to triangles in trilist format. + // leave out the edges if we need to stitch those in case over lower LOD at the + // neighbour. + for (unsigned int j = north; j < mTileSize-1 - south; j += step) + { + for (unsigned int i = west; i < mTileSize-1 - east; i += step) + { + // triangles + *pIdx++ = index(i, j); + *pIdx++ = index(i, j+step); + *pIdx++ = index(i+step, j); + + *pIdx++ = index(i, j+step); + *pIdx++ = index(i+step, j+step); + *pIdx++ = index(i+step, j); + + numIndexes += 6; + } + } + + // stitching edges to neighbours where needed + if (northLOD) + numIndexes += stitchEdge(NORTH, lod, northLOD, westLOD > 0, eastLOD > 0, &pIdx); + if (eastLOD) + numIndexes += stitchEdge(EAST, lod, eastLOD, northLOD > 0, southLOD > 0, &pIdx); + if (southLOD) + numIndexes += stitchEdge(SOUTH, lod, southLOD, eastLOD > 0, westLOD > 0, &pIdx); + if (westLOD) + numIndexes += stitchEdge(WEST, lod, westLOD, southLOD > 0, northLOD > 0, &pIdx); + + indexData->indexBuffer->unlock(); + indexData->indexCount = numIndexes; + indexData->indexStart = 0; + + return indexData; + } + + + int IndexHandler::stitchEdge(int direction, unsigned int hiLOD, unsigned int loLOD, bool omitFirstTri, + bool omitLastTri, unsigned short** ppIdx) + { + assert(loLOD > hiLOD); + + // code taken from Ogre's TSM + + unsigned short* pIdx = *ppIdx; + + int step = 1 << hiLOD; + int superstep = 1 << loLOD; + int halfsuperstep = superstep >> 1; + int rowstep = 0; + size_t startx = 0, starty = 0, endx = 0; + bool horizontal = false; + switch (direction) + { + case NORTH: + startx = starty = 0; + endx = mTileSize - 1; + rowstep = step; + horizontal = true; + break; + + case SOUTH: + startx = starty = mTileSize-1; + endx = 0; + rowstep = -step; + step = -step; + superstep = -superstep; + halfsuperstep = -halfsuperstep; + horizontal = true; + break; + + case EAST: + startx = 0; + endx = mTileSize-1; + starty = mTileSize-1; + rowstep = -step; + horizontal = false; + break; + + case WEST: + startx = mTileSize-1; + endx = 0; + starty = 0; + rowstep = step; + step = -step; + superstep = -superstep; + halfsuperstep = -halfsuperstep; + horizontal = false; + break; + } + + unsigned int numIndexes = 0; + + for (size_t j = startx; j != endx; j += superstep) + { + int k; + for (k = 0; k != halfsuperstep; k += step) + { + size_t jk = j + k; + if (j != startx || k != 0 || !omitFirstTri) + { + if (horizontal) + { + *pIdx++ = index(j, starty); + *pIdx++ = index(jk, starty + rowstep); + *pIdx++ = index(jk + step, starty + rowstep); + } + else + { + *pIdx++ = index(starty, j); + *pIdx++ = index(starty+rowstep, jk); + *pIdx++ = index(starty+rowstep, jk+step); + } + numIndexes += 3; + } + } + + if (horizontal) + { + *pIdx++ = index(j, starty); + *pIdx++ = index(j+halfsuperstep, starty+rowstep); + *pIdx++ = index(j+superstep, starty); + } + else + { + *pIdx++ = index(starty, j); + *pIdx++ = index(starty+rowstep, j+halfsuperstep); + *pIdx++ = index(starty, j+superstep); + } + numIndexes += 3; + + for (k = halfsuperstep; k != superstep; k += step) + { + size_t jk = j + k; + if (j != endx - superstep || k != superstep - step || !omitLastTri) + { + if (horizontal) + { + *pIdx++ = index(j+superstep, starty); + *pIdx++ = index(jk, starty+rowstep); + *pIdx++ = index(jk+step, starty+rowstep); + } + else + { + *pIdx++ = index(starty, j+superstep); + *pIdx++ = index(starty+rowstep, jk); + *pIdx++ = index(starty+rowstep, jk+step); + } + numIndexes += 3; + } + } + } + + *ppIdx = pIdx; + + return numIndexes; + } + } +} Added: trunk/python-ogre/ThirdParty/et/ETLightmap.cpp =================================================================== --- trunk/python-ogre/ThirdParty/et/ETLightmap.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETLightmap.cpp 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,327 @@ +/* +EDITABLE TERRAIN MANAGER for Ogre +Copyright (C) 2007 Holger Frydrych <h.f...@gm...> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. +*/ + +#include "ETTerrainInfo.h" +#include <OgreImage.h> +#include <OgreColourValue.h> +#include <OgreVector3.h> +#include <OgreAxisAlignedBox.h> +#include <OgreException.h> + +using namespace Ogre; +using namespace std; + +namespace ET +{ + namespace Impl + { + /** Add terrain shadows to lightmap. */ + void addTerrainShadowsToLightmap(uchar* lightMap, const TerrainInfo& info, + size_t width, size_t height, const Vector3& lightDir, const ColourValue& ambient) + { + // algorithm for ray traced shadow map as described here: + // http://gpwiki.org/index.php/Faster_Ray_Traced_Terrain_Shadow_Maps + size_t i, j; + size_t *x, *z; + int iDir, jDir; + size_t iSize, jSize; + float lDirXAbs = fabs(lightDir.x); + float lDirZAbs = fabs(lightDir.z); + + // based on the direction of light, decide in which order to traverse + // to speed up calculations + if (lDirXAbs > lDirZAbs) + { + z = &i; + x = &j; + iSize = height; + jSize = width; + if (lightDir.x < 0) + { + j = jSize - 1; + jDir = -1; + } + else + { + j = 0; + jDir = 1; + } + if (lightDir.z < 0) + { + i = iSize - 1; + iDir = -1; + } + else + { + i = 0; + iDir = 1; + } + } + else + { + x = &i; + z = &j; + jSize = height; + iSize = width; + if (lightDir.x < 0) + { + i = iSize - 1; + iDir = -1; + } + else + { + i = 0; + iDir = 1; + } + if (lightDir.z < 0) + { + j = jSize - 1; + jDir = -1; + } + else + { + j = 0; + jDir = 1; + } + } + + // calculate the step size to use + AxisAlignedBox extents = info.getExtents(); + Vector3 pos = extents.getMinimum(); + Vector3 step = extents.getMaximum() - extents.getMinimum(); + step.x /= width; + step.z /= height; + + float* flagMap = new float[width*height]; + memset(flagMap, 0, width*height*sizeof(float)); + + while (1) + { + while (1) + { + // travel along terrain until we: + // (1) intersect another point + // (2) find another point with previous collision data + // (3) reach the edge of the map + float px = *x; + float pz = *z; + size_t index = (*z) * width + (*x); + + // travel along ray + while (1) + { + px -= lightDir.x; + pz -= lightDir.z; + + // check if we've reached the boundary + if (px < 0 || px >= width || pz < 0 || pz >= height) + { + flagMap[index] = -1.0f; + break; + } + + // calculate interpolated values + int x0 = (int)floor(px); + int x1 = (int)ceil(px); + int z0 = (int)floor(pz); + int z1 = (int)ceil(pz); + + float du = px - x0; + float dv = pz - z0; + float invdu = 1.0 - du; + float invdv = 1.0 - dv; + float w0 = invdu * invdv; + float w1 = invdu * dv; + float w2 = du * invdv; + float w3 = du * dv; + + // get interpolated height at position + Vector3 curPos = pos + Vector3(px*step.x, 0, pz*step.z); + float ipHeight = info.getHeightAt(curPos.x, curPos.z) - pos.y; + + // compute interpolated flagmap value + float pixels[4]; + pixels[0] = flagMap[z0*width+x0]; + pixels[1] = flagMap[z1*width+x0]; + pixels[2] = flagMap[z0*width+x1]; + pixels[3] = flagMap[z1*width+x1]; + float ipFlag = w0*pixels[0] + w1*pixels[1] + w2*pixels[2] + w3*pixels[3]; + + // get distance from original point to current point + float realXDist = (px - *x) * step.x; + float realZDist = (pz - *z) * step.z; + float distance = sqrt(realXDist*realXDist + realZDist*realZDist); + + // calculate ray height at current point + float height = info.getHeightAt(pos.x + (*x)*step.x, pos.z + (*z)*step.z) - pos.y - lightDir.y*distance; + + // check intersection with either terrain or flagMap + // if ipHeight < ipFlag check against flagMap value + float val = (ipHeight < ipFlag ? ipFlag : ipHeight); + if (height < val) + { + // point in shadow + flagMap[index] = val - height; + lightMap[index*3+0] = (uchar) (255*ambient.r); + lightMap[index*3+1] = (uchar) (255*ambient.g); + lightMap[index*3+2] = (uchar) (255*ambient.b); + break; + } + + // check if pixel we moved to is unshadowed + // since the flagMap value is interpolated, we use an epsilon value to check + // if it's close enough to -1 to indicate non-shadow + const float epsilon = 0.5f; + if (ipFlag < -1.0f+epsilon && ipFlag > -1.0f-epsilon) + { + flagMap[index] = -1.0f; + break; + } + } + + // update inner loop + j += jDir; + if (j >= jSize) // due to size_t, if j < 0, will wrap around and be > jSize ;) + break; + } + + // reset inner loop starting point + if (jDir < 0) + j = jSize-1; + else + j = 0; + + // update outer loop variable + i += iDir; + if (i >= iSize) + break; + + } + + delete[] flagMap; + } + + + void boxFilterLightmap(uchar* lightMap, size_t width, size_t height) + { + // this box filter assigns to a pixel the average of itself and all + // surrounding pixels in a 5x5 grid + for (size_t i = 0; i < width; ++i) + { + for (size_t j = 0; j < height; ++j) + { + int col[3] = {0, 0, 0}; + // sum up all colours from 5x5 grid around the current pixel + int cnt = 0; + for (int x = -1; x <= 1; ++x) + { + if ((int)i+x < 0 || i+x >= width) + continue; + for (int y = -1; y <= 1; ++y) + { + if ((int)j+y < 0 || j+y >= height) + continue; + size_t index = (i+x + (j+y)*width)*3; + col[0] += lightMap[index+0]; + col[1] += lightMap[index+1]; + col[2] += lightMap[index+2]; + ++cnt; + } + } + // building average + col[0] /= cnt; + col[1] /= cnt; + col[2] /= cnt; + // write back + size_t index = (i + j*width)*3; + lightMap[index+0] = (uchar)col[0]; + lightMap[index+1] = (uchar)col[1]; + lightMap[index+2] = (uchar)col[2]; + } + } + } + } + + + + void createTerrainLightmap(const TerrainInfo& info, Image& image, + size_t width, size_t height, Vector3 lightDir, const ColourValue& lightCol, + const ColourValue& ambient, bool shadowed) + { + lightDir.normalise(); + + // calculate lightmap by multiplying light dir with terrain normals + + // calculate the step size to use + AxisAlignedBox extents = info.getExtents(); + Vector3 startPos = extents.getMinimum(); + Vector3 step = extents.getMaximum() - extents.getMinimum(); + step.x /= width; + step.z /= height; + Vector3 pos = startPos; + + uchar* lightMap = new uchar[width*height * 3]; + memset(lightMap, 255, width*height*3); + + for (size_t z = 0; z < height; ++z) + { + for (size_t x = 0; x < width; ++x) + { + size_t index = (z * width + x)*3; + // calculate diffuse light from light source + Vector3 norm = info.getNormalAt(pos.x, pos.z); + float l = std::max(0.0f, -lightDir.dotProduct(norm)); + + ColourValue v = ambient; + v.r = std::min(1.0f, v.r+l*lightCol.r); + v.g = std::min(1.0f, v.g+l*lightCol.g); + v.b = std::min(1.0f, v.b+l*lightCol.b); + lightMap[index+0] = (uchar) (255*v.r); + lightMap[index+1] = (uchar) (255*v.g); + lightMap[index+2] = (uchar) (255*v.b); + + pos.x += step.x; + } + pos.x = startPos.x; + pos.z += step.z; + } + + if (shadowed && (lightDir.x != 0 || lightDir.z != 0)) + { + // add terrain shadows + Impl::addTerrainShadowsToLightmap(lightMap, info, width, height, lightDir, ambient); + } + + // use a box filter to smoothen the lightmap + Impl::boxFilterLightmap(lightMap, width, height); + + // save lightmap to image + image.loadDynamicImage(lightMap, width, height, 1, PF_BYTE_RGB, true); + // ownership of lightMap was transfered to image, don't need to delete + } +} Added: trunk/python-ogre/ThirdParty/et/ETLoadSaveHeightmap.cpp =================================================================== --- trunk/python-ogre/ThirdParty/et/ETLoadSaveHeightmap.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETLoadSaveHeightmap.cpp 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,167 @@ +/* +EDITABLE TERRAIN MANAGER for Ogre +Copyright (C) 2007 Holger Frydrych <h.f...@gm...> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. +*/ + +#include "ETTerrainInfo.h" + +#include <OgreDataStream.h> +#include <OgreImage.h> +#include <OgreException.h> + +#include <iostream> + +using namespace Ogre; +using namespace std; +using Ogre::uint; +using Ogre::ushort; + +namespace ET +{ + void loadHeightmapFromImage(TerrainInfo& info, const Image& image) + { + uint bpp = 0; + bool flip = false; + + switch (image.getFormat()) + { + case PF_BYTE_A: case PF_BYTE_L: + bpp = 1; break; + case PF_BYTE_LA: case PF_L16: + bpp = 2; break; + case PF_BYTE_RGB: + bpp = 3; break; + case PF_BYTE_BGR: + bpp = 3; flip = true; break; + case PF_BYTE_RGBA: + bpp = 4; break; + case PF_BYTE_BGRA: + bpp = 4; flip = true; break; + default: + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Can't use the given image's format.", "loadHeightmapFromImage"); + } + + size_t size = image.getWidth() * image.getHeight(); + unsigned int maxVal = (1 << (bpp*8)) - 1; + vector<float> data (size); + const uchar* imageData = image.getData(); + + for (size_t i = 0; i < size; ++i) + { + uchar read[4] = {0, 0, 0, 0}; + // TODO: Make this big endian aware/compatible + memcpy(read, imageData, bpp); + imageData += bpp; + if (flip) + swap(read[0], read[2]); + unsigned int val = * ((unsigned int*)read); + data[i] = float(val) / maxVal; + } + + info.setHeightmap(image.getWidth(), image.getHeight(), data); + } + + + void saveHeightmapToImage(const TerrainInfo& info, Ogre::Image& image, unsigned int bpp) + { + PixelFormat pf; + // decide on the image format to use + switch (bpp) + { + case 1: + pf = PF_BYTE_L; break; + case 2: + pf = PF_L16; break; + case 3: + pf = PF_BYTE_RGB; break; + case 4: + pf = PF_BYTE_RGBA; break; + default: + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Bpp must be between 1 and 4.", "saveHeightmapToImage"); + } + + uint maxVal = (1 << (bpp*8)) - 1; + + uchar* data = new uchar[info.getWidth()*info.getHeight()*bpp]; + uchar* pos = data; + + // fill data array + for (size_t j = 0; j < info.getHeight(); ++j) + { + for (size_t i = 0; i < info.getWidth(); ++i) + { + uint val = uint (maxVal * info.at(i, j)); + memcpy(pos, &val, bpp); + pos += bpp; + } + } + + image.loadDynamicImage(data, info.getWidth(), info.getHeight(), 1, pf, true); + // given ownership of data to image + } + + + + + void loadHeightmapFromRawData(TerrainInfo& info, DataStream& stream, size_t width, size_t height) + { + size_t size = width*height; + size_t bpp = stream.size() / size; + if (bpp < 1 || bpp > 4 || stream.size() % size != 0) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Size of the given data stream does not match with specified dimensions.", "loadHeightmapFromRawData"); + + unsigned int maxVal = (1 << (bpp*8)) - 1; + vector<float> data (size); + + for (size_t i = 0; i < size; ++i) + { + unsigned int val = 0; + // TODO: What about big endian compatibility? + stream.read((void*)&val, bpp); + data[i] = float(val) / maxVal; + } + + info.setHeightmap(width, height, data); + } + + + void saveHeightmapToRawData(const TerrainInfo& info, ostream& stream, uint bpp) + { + if (bpp < 1 || bpp > 4) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Bpp must be between 1 and 4.", "saveHeightmapToRawData"); + + uint maxVal = (1 << (bpp*8)) - 1; + for (size_t j = 0; j < info.getHeight(); ++j) + { + for (size_t i = 0; i < info.getWidth(); ++i) + { + uint val = (uint) (maxVal * info.at(i, j)); + stream.write(reinterpret_cast<char*>(&val), bpp); + } + } + } + +} Added: trunk/python-ogre/ThirdParty/et/ETPrerequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/et/ETPrerequisites.h (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETPrerequisites.h 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,28 @@ +#ifndef __ETPREREQUISITES_H__ +#define __ETPREREQUISITES_H__ + +#include <OgrePlatform.h> + +#define _ETManagerExport + +// // #ifndef _ETManagerExport + +// // #if (OGRE_PLATFORM == OGRE_PLATFORM_WIN32 ) +// // # ifdef ET_MANAGER_EXPORTS +// // # define _ETManagerExport __declspec(dllexport) +// // # else +// // # if defined( __MINGW32__ ) +// // # define _ETManagerExport +// // # else +// // # define _ETManagerExport __declspec(dllimport) +// // # endif +// // # endif +// // #elif defined ( OGRE_GCC_VISIBILITY ) +// // # define _ETManagerExport __attribute__ ((visibility("default"))) +// // #else +// // # define _ETManagerExport +// // #endif + +// // #endif + +#endif Added: trunk/python-ogre/ThirdParty/et/ETSplattingManager.cpp =================================================================== --- trunk/python-ogre/ThirdParty/et/ETSplattingManager.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETSplattingManager.cpp 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,518 @@ +/* +EDITABLE TERRAIN MANAGER for Ogre +Copyright (C) 2007 Holger Frydrych <h.f...@gm...> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. +*/ + +#include "ETSplattingManager.h" +#include "ETBrush.h" + +#include <OgreResource.h> +#include <OgreImage.h> +#include <OgreTextureManager.h> +#include <OgreStringConverter.h> +#include <OgreHardwarePixelBuffer.h> +#include <OgreException.h> + +#include <OgreLogManager.h> +#include <sstream> + +using namespace Ogre; +using namespace std; +using Ogre::uint; +using Ogre::ushort; + + +namespace ET +{ + namespace Impl + { + /** Handles a single alpha coverage map texture */ + class CoverageMap : public ManualResourceLoader + { + public: + CoverageMap(const String& name, const String& group, uint width, uint height, int channels, bool black = true); + ~CoverageMap(); + + /** Retrieve coverage map from image. */ + void loadFromImage(const Image& image); + /** Save coverage map to image. */ + void saveToImage(Image& image); + + /** Get the map's value for texture index c at position (x, y) */ + uchar getValue(uint x, uint y, uint c) const; + /** Set the map's value for texture index c at position (x, y) */ + void setValue(uint x, uint y, uint c, uchar val); + + /** Copy the editing buffer into the texture's pixel buffer. */ + void updateTexture(); + + /** Implemented from ManualResourceLoader to support reloading of the coverage map. */ + void loadResource(Resource*); + + /** Texture resource name for this coverage map. */ + const String& getName() const; + + private: + PixelFormat getFormat(int channels); + int getChannels(PixelFormat format); + + uint mWidth, mHeight, mSize; + int mChannels; + uchar* mData; + TexturePtr mTexture; + }; + + + CoverageMap::CoverageMap(const String& name, const String& group, uint width, uint height, int channels, bool black) + : mWidth(width), mHeight(height), mChannels(channels), mSize(width*height*channels) + { + mData = new uchar[mSize]; + memset(mData, 0, mSize); + // the first channel of the first coverage map is set to full value so that + // terrain initially is rendered with the first splatting texture + if (!black) + for (uint i = 0; i < mSize; i += mChannels) + mData[i] = 255; + // create a manually managed texture resource + mTexture = TextureManager::getSingleton().createManual(name, group, TEX_TYPE_2D, + width, height, 1, 0, getFormat(mChannels), TU_DEFAULT, this); + } + + CoverageMap::~CoverageMap() + { + delete[] mData; + TextureManager::getSingleton().remove(mTexture->getName()); + } + + void CoverageMap::loadResource(Resource*) + { + // the texture has requested to (re)load, we just copy our edit buffer + // into the texture + mTexture->createInternalResources(); + updateTexture(); + } + + void CoverageMap::updateTexture() + { + // write the edit buffer into the texture's pixel buffer + HardwarePixelBufferSharedPtr buffer = mTexture->getBuffer(); + PixelBox pixelBox (mWidth, mHeight, 1, getFormat(mChannels), mData); + Image::Box imageBox (0, 0, mWidth, mHeight); + buffer->blitFromMemory(pixelBox, imageBox); + } + + const String& CoverageMap::getName() const + { + return mTexture->getName(); + } + + uchar CoverageMap::getValue(uint x, uint y, uint c) const + { + return mData[(y*mWidth + x)*mChannels + c]; + } + + void CoverageMap::setValue(uint x, uint y, uint c, uchar val) + { + mData[(y*mWidth + x)*mChannels + c] = val; + } + + + PixelFormat CoverageMap::getFormat(int channels) + { + switch (channels) + { + case 1: return PF_BYTE_A; + case 2: return PF_BYTE_LA; + case 3: return PF_BYTE_RGB; + case 4: return PF_BYTE_RGBA; + case -1: return PF_BYTE_A; + case -2: return PF_BYTE_LA; + case -3: return PF_BYTE_BGR; + case -4: return PF_BYTE_BGRA; + default: return PF_UNKNOWN; + } + } + + int CoverageMap::getChannels(PixelFormat format) + { + switch (format) + { + case PF_BYTE_A: return 1; + case PF_BYTE_LA: return 2; + case PF_BYTE_RGB: return 3; + case PF_BYTE_BGR: return -3; + case PF_BYTE_RGBA: return 4; + case PF_BYTE_BGRA: return -4; + default: return 0; + } + } + + void CoverageMap::loadFromImage(const Image& image) + { + if (image.getWidth() != mWidth || image.getHeight() != mHeight) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Given image doesn't conform to the used width and height.", "CoverageMap::loadFromImage"); + if (image.getFormat() != getFormat(mChannels) && image.getFormat() != getFormat(-mChannels)) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Given image is of invalid pixel format.", "CoverageMap::loadFromImage"); + + memcpy(mData, image.getData(), image.getSize()); + if (getChannels(image.getFormat()) <= -3) + { + // need RGB(A), but given BGR(A) so invert + for (uint i = 0; i < mSize; i += mChannels) + swap(mData[i], mData[i+2]); + } + + updateTexture(); + } + + void CoverageMap::saveToImage(Image& image) + { + image.loadDynamicImage(mData, mWidth, mHeight, 1, getFormat(mChannels)); + } + + + + struct SplattingImpl + { + String baseName; + String group; + uint width, height; + uint channels; + uint numTextures; + uint numMaps; + + typedef vector<Impl::CoverageMap*> MapList; + MapList maps; + + void paint(uint texture, uint x, uint y, float edit) + { + uint map = texture / channels; + uint channel = texture % channels; + int val = maps[map]->getValue(x, y, channel) + (int) (255.0 * edit); + if (val > 255) + val = 255; + if (val < 0) + val = 0; + maps[map]->setValue(x, y, channel, val); + + balance(x, y, texture, val); + } + + void balance(uint x, uint y, uint texture, int val) + { + // this method ensures that the values at (x, y) of all channels in all maps sum up to 255, + // otherwise the terrain will get over- or underlighted at that position + int sum = 0; + for (uint i = 0; i < numMaps; ++i) + { + for (uint j = 0; j < channels; ++j) + { + // skip the texture we painted with, otherwise we'd be + // undoing the change + if (i * channels + j == texture) + continue; + sum += maps[i]->getValue(x, y, j); + } + } + + if (sum == 0) + { + // all other textures are 0, so set selected texture to full value + maps[texture/channels]->setValue(x, y, texture%channels, 255); + return; + } + + // reduce/add all other channels as necessary + int diff = sum - (255 - val); + for (uint i = 0; i < numMaps; ++i) + { + for (uint j = 0; j < channels; ++j) + { + // skip the texture we painted with, otherwise we'd be + // undoing the change + if (i * channels + j == texture) + continue; + uchar v = maps[i]->getValue(x, y, j); + v -= (uchar) floor(0.5 + diff * (float(v) / sum)); + maps[i]->setValue(x, y, j, v); + } + } + } + + void updateTextures() + { + // update all map textures + for (uint i = 0; i < numMaps; ++i) + maps[i]->updateTexture(); + } + + + // helper function for createBaseTexture + float interpolateWeight(size_t x, size_t y, size_t maxX, size_t maxY, size_t channel) + { + // get base position and interpolation + float realPosX = float(x) * width / maxX; + float realPosY = float(y) * height / maxY; + uint posX = (uint)realPosX, posY = (uint)realPosY; + float interpX = realPosX - posX, interpY = realPosY - posY; + // adjust if at borders + if (posX == width-1) + { + --posX; + interpX = 1.0f; + } + if (posY == height-1) + { + --posY; + interpY = 1.0f; + } + float interpXi = 1.0f-interpX, interpYi = 1.0f-interpY; + size_t m = channel/channels; + uint c = (uint) (channel%channels); + + float val = maps[m]->getValue(posX, posY, c) * interpXi * interpYi; + val += maps[m]->getValue(posX+1, posY, c) * interpX * interpYi; + val += maps[m]->getValue(posX+1, posY+1, c) * interpX * interpY; + val += maps[m]->getValue(posX, posY+1, c) * interpXi * interpY; + val /= 255; + return val; + } + + }; + + } + + + + + SplattingManager::SplattingManager(const string& baseName, const string& group, uint width, uint height, uint channels) + { + if (channels < 1 || channels > 4) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Number of channels per texture must be between 1 and 4", "SplattingManager::SplattingManager"); + + mImpl = new Impl::SplattingImpl(); + mImpl->baseName = baseName; + mImpl->group = group; + mImpl->width = width; + mImpl->height = height; + mImpl->channels = channels; + mImpl->numTextures = 0; + mImpl->numMaps = 0; + } + + SplattingManager::~SplattingManager() + { + for (uint i = 0; i < mImpl->numMaps; ++i) + delete mImpl->maps[i]; + delete mImpl; + } + + void SplattingManager::setNumTextures(uint numTextures) + { + // the number of maps needed depends on the number of channels per texture + if (numTextures == 0) + setNumMaps(0); + else + setNumMaps((numTextures-1) / mImpl->channels + 1); + } + + uint SplattingManager::getNumTextures() const + { + return mImpl->numTextures; + } + + void SplattingManager::setNumMaps(uint numMaps) + { + mImpl->numMaps = numMaps; + mImpl->numTextures = mImpl->numMaps * mImpl->channels; + + // add maps if we don't have enough + for (size_t i = mImpl->maps.size(); i <= mImpl->numMaps; ++i) + { + mImpl->maps.push_back(new Impl::CoverageMap(mImpl->baseName+StringConverter::toString(i), + mImpl->group, mImpl->width, mImpl->height, mImpl->channels, i != 0)); + } + + // remove maps if there are too many + for (size_t i = mImpl->maps.size(); i > mImpl->numMaps; --i) + { + delete *mImpl->maps.rbegin(); + mImpl->maps.pop_back(); + } + } + + uint SplattingManager::getNumMaps() const + { + return mImpl->numMaps; + } + + NameList SplattingManager::getMapTextureNames() const + { + NameList names; + for (size_t i = 0; i < mImpl->maps.size(); ++i) + names.push_back(mImpl->maps[i]->getName()); + return names; + } + + void SplattingManager::loadMapFromImage(uint mapNum, const Image& image) + { + mImpl->maps[mapNum]->loadFromImage(image); + } + + void SplattingManager::saveMapToImage(uint mapNum, Image& image) + { + mImpl->maps[mapNum]->saveToImage(image); + } + + + void SplattingManager::paint(uint textureNum, int x, int y, const Brush& brush, float intensity) + { + // positions given are supposed to be the mid of the brush + // so adjust accordingly + x -= (int)brush.getWidth()/2; + y -= (int)brush.getHeight()/2; + + // iterate over all fields of the brush array and apply them to the map textures + // if they lie within the bounds + for (size_t i = 0; i < brush.getWidth(); ++i) + { + int posX = x + (int)i; + if (posX < 0 || posX >= (int)mImpl->width) + continue; + for (size_t j = 0; j < brush.getHeight(); ++j) + { + int posY = y + (int)j; + if (posY < 0 || posY >= (int)mImpl->height) + continue; + + mImpl->paint(textureNum, (uint)posX, (uint)posY, brush.at(i, j) * intensity); + } + } + + // finally, update the textures + mImpl->updateTextures(); + } + + + void SplattingManager::createColourMap(Image& image, const ColourList& colours) + { + if (colours.size() > mImpl->numTextures) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Given more colours than texture channels available.", __FUNCTION__); + + uchar* data = new uchar[mImpl->width*mImpl->height*3]; + + for (size_t y = 0; y < mImpl->height; ++y) + { + for (size_t x = 0; x < mImpl->width; ++x) + { + ColourValue val (0, 0, 0); + for (size_t i = 0; i < colours.size(); ++i) + { + size_t m = i / mImpl->channels; + uint t = (uint) (i % mImpl->channels); + val += colours[i] * (float(mImpl->maps[m]->getValue((uint)x, (uint)y, t)) / 255); + } + + size_t pos = (x + y * mImpl->width) * 3; + data[pos+0] = uchar(255*val.r); + data[pos+1] = uchar(255*val.g); + data[pos+2] = uchar(255*val.b); + } + } + + image.loadDynamicImage(data, mImpl->width, mImpl->height, 1, PF_BYTE_RGB, true); + } + + + + void SplattingManager::createBaseTexture(Image& image, size_t width, size_t height, + ImageList textures, float repeatX, float repeatZ) + { + if (textures.size() > mImpl->numTextures) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Given more textures than texture channels available.", "ET::SplattingManager::createBaseTexture"); + + // first resize the textures according to the desired output size and the repeat values + ushort scaleWidth = (ushort) (width / repeatX); + ushort scaleHeight = (ushort) (height / repeatZ); + for (ImageList::iterator it = textures.begin(); it != textures.end(); ++it) + it->resize(scaleWidth, scaleHeight); + + // create the buffer to hold our generated base texture + uchar* data = new uchar[width*height*3]; + size_t pos = 0; + for (size_t y = 0; y < height; ++y) + { + for (size_t x = 0; x < width; ++x) + { + ColourValue val (0,0,0); + int texX = (int) (x % scaleWidth); + int texY = (int) (y % scaleHeight); + for (size_t t = 0; t < textures.size(); ++t) + { + // get interpolated part of this texture at the current pixel + float weight = mImpl->interpolateWeight(x, y, width, height, t); + // get colour value of the texture image + ColourValue col = textures[t].getColourAt(texX, texY, 0); + // add to the pixel colour level + val += weight*col; + } + + // write colour to our buffer + data[pos+0] = uchar(255*val.r); + data[pos+1] = uchar(255*val.g); + data[pos+2] = uchar(255*val.b); + pos += 3; + } + } + + image.loadDynamicImage(data, width, height, 1, PF_BYTE_RGB, true); + } + + + Image createMinimap(const Image& colourMap, const Image& lightMap) + { + if (colourMap.getWidth() != lightMap.getWidth() || colourMap.getHeight() != lightMap.getHeight()) + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Images must have the same dimensions.", __FUNCTION__); + + uchar* data = new uchar[colourMap.getWidth()*colourMap.getHeight()*3]; + + for (size_t y = 0; y < colourMap.getWidth(); ++y) + { + for (size_t x = 0; x < colourMap.getHeight(); ++x) + { + ColourValue val = const_cast<Image&>(colourMap).getColourAt((uint)x, (uint)y, 0) * const_cast<Image&>(lightMap).getColourAt((uint)x, (uint)y, 0); + size_t pos = (x + y*colourMap.getWidth()) * 3; + data[pos+0] = uchar(255*val.r); + data[pos+1] = uchar(255*val.g); + data[pos+2] = uchar(255*val.b); + } + } + + Image image; + image.loadDynamicImage(data, colourMap.getWidth(), colourMap.getHeight(), 1, PF_BYTE_RGB, true); + return image; + } +} Added: trunk/python-ogre/ThirdParty/et/ETSplattingManager.h =================================================================== --- trunk/python-ogre/ThirdParty/et/ETSplattingManager.h (rev 0) +++ trunk/python-ogre/ThirdParty/et/ETSplattingManager.h 2007-10-05 04:16:07 UTC (rev 408) @@ -0,0 +1,133 @@ +#ifndef __ETSPLATTINGMANAGER_H__ +#define __ETSPLATTINGMANAGER_H__ + +/* +EDITABLE TERRAIN MANAGER for Ogre +Copyright (C) 2007 Holger Frydrych <h.f...@gm...> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. +*/ + +#include "ETPrerequisites.h" + +#include "OgreColourValue.h" +#include "OgreImage.h... [truncated message content] |
From: <and...@us...> - 2007-10-03 06:30:16
|
Revision: 407 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=407&view=rev Author: andy_miller Date: 2007-10-02 23:30:20 -0700 (Tue, 02 Oct 2007) Log Message: ----------- More demo changes ready for 1.1 Modified Paths: -------------- trunk/python-ogre/demos/media/materials/programs/Grass.cg trunk/python-ogre/demos/nxogre/resources.cfg trunk/python-ogre/demos/ogreal/resources.cfg Added Paths: ----------- trunk/python-ogre/demos/cegui/ trunk/python-ogre/demos/cegui/CEGUI_framework.py trunk/python-ogre/demos/cegui/Demo_CEGUI_DragnDrop.py trunk/python-ogre/demos/cegui/Demo_CEGUI_Facial.py trunk/python-ogre/demos/cegui/Demo_CEGUI_Gui.py trunk/python-ogre/demos/cegui/Demo_CEGUI_NewGui.py trunk/python-ogre/demos/cegui/SampleFramework.py trunk/python-ogre/demos/cegui/plugins.cfg trunk/python-ogre/demos/cegui/resources.cfg trunk/python-ogre/demos/cegui/tofix/ trunk/python-ogre/demos/cegui/tofix/DebugConsoleDemo.py trunk/python-ogre/demos/cegui/tofix/LayoutCreationDemo.py trunk/python-ogre/demos/cegui/tofix/ManualCreationDemo.py trunk/python-ogre/demos/cegui/tofix/MenuDemo.py trunk/python-ogre/demos/cegui/tofix/MultiColumnListBox6.py trunk/python-ogre/demos/cegui/tofix/MultipleLayoutDemo.py trunk/python-ogre/demos/cegui/tofix/RenderToTextureDemo.py trunk/python-ogre/demos/cegui/tofix/TabControlDemo.py trunk/python-ogre/demos/cegui/tofix/VanillaBackgroundDemo.py trunk/python-ogre/demos/cegui/tofix/WindowsBackgroundDemo.py trunk/python-ogre/demos/nxogre/media/ trunk/python-ogre/demos/nxogre/media/ComplexMeshes/ trunk/python-ogre/demos/nxogre/media/ComplexMeshes/cloth.material trunk/python-ogre/demos/nxogre/media/ComplexMeshes/nx.flag.png trunk/python-ogre/demos/nxogre/media/Env/ trunk/python-ogre/demos/nxogre/media/Env/nx.floor.material trunk/python-ogre/demos/nxogre/media/Env/nx.floor.mesh trunk/python-ogre/demos/nxogre/media/Env/nx.floor.png trunk/python-ogre/demos/nxogre/media/Env/nx.floor.shadowalpha.png trunk/python-ogre/demos/nxogre/media/Env/nx.skygrid.png trunk/python-ogre/demos/nxogre/media/Essential/ trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/ trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.button.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.button.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.material trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.pointer.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.textinput.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.textinput.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.window.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.window.resize.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.window.resize.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUI/bgui.window.titlebar.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/ trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/bgui.exit.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/bgui.exit.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/bgui.pause.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/bgui.pause.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/debug.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/debug.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/debugon.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/debugon.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.material.material trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.material.text.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.material.window.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.material.window.titlebar.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.confirm.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.confirm.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.do.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.do.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.up.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/editor.microtext.up.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/nxbgui.material trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/pause.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/pause.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/play.active.png trunk/python-ogre/demos/nxogre/media/Essential/BetaGUIExtended/play.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/ trunk/python-ogre/demos/nxogre/media/Essential/Boot/101.jpg trunk/python-ogre/demos/nxogre/media/Essential/Boot/102.jpg trunk/python-ogre/demos/nxogre/media/Essential/Boot/103.jpg trunk/python-ogre/demos/nxogre/media/Essential/Boot/any.jpg trunk/python-ogre/demos/nxogre/media/Essential/Boot/arrow1.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/axis_x.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/axis_y.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/axis_z.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/bodyguide1m.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/boot.material trunk/python-ogre/demos/nxogre/media/Essential/Boot/debug.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui.material trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_loading.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_loading_notice.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_options.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_options_selected.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_pause.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_save.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_save_selected.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/gui_slowfast.png trunk/python-ogre/demos/nxogre/media/Essential/Boot/nx.body.axis.mesh trunk/python-ogre/demos/nxogre/media/Essential/Boot/nx.bodyguide.material trunk/python-ogre/demos/nxogre/media/Essential/Boot/nx.bodyguide.mesh trunk/python-ogre/demos/nxogre/media/Essential/Fonts/ trunk/python-ogre/demos/nxogre/media/Essential/Fonts/MgOpen.license.txt trunk/python-ogre/demos/nxogre/media/Essential/Fonts/MgOpen.png trunk/python-ogre/demos/nxogre/media/Essential/Fonts/MgOpen.ttf trunk/python-ogre/demos/nxogre/media/Essential/Fonts/MgOpenAsBitmap.fontdef trunk/python-ogre/demos/nxogre/media/Essential/Fonts/MgOpenAsNxOgreFont.fontdef trunk/python-ogre/demos/nxogre/media/Essential/icon.cube.png trunk/python-ogre/demos/nxogre/media/Essential/icon.sphere.png trunk/python-ogre/demos/nxogre/media/Essential/widget.add.active.png trunk/python-ogre/demos/nxogre/media/Essential/widget.add.png trunk/python-ogre/demos/nxogre/media/Essential/widget.angle.over.png trunk/python-ogre/demos/nxogre/media/Essential/widget.angle.png trunk/python-ogre/demos/nxogre/media/Essential/widget.create.png trunk/python-ogre/demos/nxogre/media/Essential/widget.edit.png trunk/python-ogre/demos/nxogre/media/Essential/widget.material.over.png trunk/python-ogre/demos/nxogre/media/Essential/widget.material.png trunk/python-ogre/demos/nxogre/media/Essential/widget.mm.bodies.over.png trunk/python-ogre/demos/nxogre/media/Essential/widget.mm.bodies.png trunk/python-ogre/demos/nxogre/media/Essential/widget.mm.fx.over.png trunk/python-ogre/demos/nxogre/media/Essential/widget.mm.fx.png trunk/python-ogre/demos/nxogre/media/Essential/widget.mm.joints.over.png trunk/python-ogre/demos/nxogre/media/Essential/widget.mm.joints.png trunk/python-ogre/demos/nxogre/media/Essential/widget.mm.png trunk/python-ogre/demos/nxogre/media/Essential/widget.scale.over.png trunk/python-ogre/demos/nxogre/media/Essential/widget.scale.png trunk/python-ogre/demos/nxogre/media/Essential/widgets.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/ trunk/python-ogre/demos/nxogre/media/SimpleMeshes/Example_BumpMapping.cg trunk/python-ogre/demos/nxogre/media/SimpleMeshes/capsule.50cmx1m.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/capsule.prefix.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/convex.prefix.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/convex1.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/cube.1m-2m-1m.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/cube.1m.h.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/cube.1m.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/cube.1m.smooth.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/cube.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/cube.prefix.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/fish.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/hilight.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx-cube-diffuse.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx-cube-normal.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx-cube-spec.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.70s1.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.block.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.block.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.convex2.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.convex2.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.convex2.mesh.xml trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.cube.png trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.flag.png trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.lava.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.planet1.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.planet2.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.sphere.50cm.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.sphere.50cm.mesh.xml trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.sphere.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.sphere1.png trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.stone1.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.tartan.dds trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.tube.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.tube.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/nx.yellow1.png trunk/python-ogre/demos/nxogre/media/SimpleMeshes/prism.12x150cmx3m.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/prism.8x50cmx2m.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/racecar.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/racecar.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/racecar1.png trunk/python-ogre/demos/nxogre/media/SimpleMeshes/sandbox.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/sphere.2m.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/sphere.50cm.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/sphere.prefix.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/squirrel.mesh trunk/python-ogre/demos/nxogre/media/SimpleMeshes/squirrel.skeleton trunk/python-ogre/demos/nxogre/media/SimpleMeshes/tyre.png trunk/python-ogre/demos/nxogre/media/SimpleMeshes/wheel50cmx10cmx50cm.material trunk/python-ogre/demos/nxogre/media/SimpleMeshes/wheel50cmx10cmx50cm.mesh trunk/python-ogre/demos/nxogre/media/resources.cfg trunk/python-ogre/demos/ogreal/media/ trunk/python-ogre/demos/ogreal/media/6chan.ogg trunk/python-ogre/demos/ogreal/media/Siren.wav trunk/python-ogre/demos/ogreal/media/motor_b8.wav trunk/python-ogre/demos/ogreal/media/roar.wav trunk/python-ogre/demos/plib/scream.ub trunk/python-ogre/demos/plib/tuxr.mod trunk/python-ogre/demos/plib/wheeee.ub trunk/python-ogre/demos/plib/zzap.wav Removed Paths: ------------- trunk/python-ogre/demos/media/fonts/read_me.html trunk/python-ogre/demos/navi/ogre.cfg trunk/python-ogre/demos/ogreforests/ogre.cfg trunk/python-ogre/demos/qgui/ogre.cfg trunk/python-ogre/demos/theora/ogre.cfg Added: trunk/python-ogre/demos/cegui/CEGUI_framework.py =================================================================== --- trunk/python-ogre/demos/cegui/CEGUI_framework.py (rev 0) +++ trunk/python-ogre/demos/cegui/CEGUI_framework.py 2007-10-03 06:30:20 UTC (rev 407) @@ -0,0 +1,83 @@ +import ogre.gui.CEGUI as CEGUI +import ogre.io.OIS as OIS +import SampleFramework + +##----------------------------------------------------------------## +def convertOISMouseButtonToCegui( buttonID): + if buttonID ==0: + return CEGUI.LeftButton + elif buttonID ==1: + return CEGUI.RightButton + elif buttonID ==2: + return CEGUI.MiddleButton + elif buttonID ==3: + return CEGUI.X1Button + else: + return CEGUI.LeftButton + +def _PointHack(x, y): + return CEGUI.Vector2(x, y) +CEGUI.Point = _PointHack + +def cegui_reldim ( x ) : + return CEGUI.UDim((x),0) + +class MouseListener ( OIS.MouseListener ): + def __init__(self): + OIS.MouseListener.__init__( self) + + ##----------------------------------------------------------------## + def mouseMoved( self, arg ): + CEGUI.System.getSingleton().injectMouseMove( arg.get_state().X.rel, arg.get_state().Y.rel ) + return True + + ##----------------------------------------------------------------## + def mousePressed( self, arg, id ): + CEGUI.System.getSingleton().injectMouseButtonDown(convertOISMouseButtonToCegui(id)) + return True + + ##----------------------------------------------------------------## + def mouseReleased( self, arg, id ): + CEGUI.System.getSingleton().injectMouseButtonUp(convertOISMouseButtonToCegui(id)) + return True + + +class GuiFrameListener(SampleFramework.FrameListener , OIS.KeyListener, OIS.MouseListener): + + def __init__(self, renderWindow, camera, CEGUIRenderer): + + SampleFramework.FrameListener.__init__(self, renderWindow, camera, True, True, True) + OIS.KeyListener.__init__(self) + self.mouselistener = MouseListener () + #OIS.MouseListener.__init_(self) + + self.Mouse.setEventCallback(self.mouselistener) + self.Keyboard.setEventCallback(self) + + self.ShutdownRequested = False + self.GUIRenderer = CEGUIRenderer + self.keepRendering = True # whether to continue rendering or not + self.numScreenShots = 0 # screen shot count + + ## Tell the frame listener to exit at the end of the next frame + def requestShutdown( self ): + self.ShutdownRequested = True + + def frameEnded(self, evt): + if self.ShutdownRequested: + return False + else: + return SampleFramework.FrameListener.frameEnded(self, evt) + + ##----------------------------------------------------------------## + def keyPressed( self, arg ): + if arg.key == OIS.KC_ESCAPE: + self.ShutdownRequested = True + CEGUI.System.getSingleton().injectKeyDown( arg.key ) + CEGUI.System.getSingleton().injectChar( arg.text ) + return True + + ##----------------------------------------------------------------## + def keyReleased( self, arg ): + CEGUI.System.getSingleton().injectKeyUp( arg.key ) + return True Added: trunk/python-ogre/demos/cegui/Demo_CEGUI_DragnDrop.py =================================================================== --- trunk/python-ogre/demos/cegui/Demo_CEGUI_DragnDrop.py (rev 0) +++ trunk/python-ogre/demos/cegui/Demo_CEGUI_DragnDrop.py 2007-10-03 06:30:20 UTC (rev 407) @@ -0,0 +1,285 @@ +# this code is in the public domain +# +# This demo shows simple drag and drop. Two frames each contain a grid +# of Static Images. Each (slot) static image is assigned dragndrop events. +# Move the static image containing the icon to different slots. +# +# This is based on a dragndrop example provided by Crazy Eddie: +# http://www.cegui.org.uk/modules/newbb/viewtopic.php?topic_id=1040&forum=2&post_id=5852#forumpost5852 +# +# +# Shows: +# Simple DragnDrop +# Creating a list of events (hope this is correct) +# Mouse Enter/Leaves Events & Change Mouse Cursor +# Setting properties by Strings +# Example control creation using UDIM +# Simple Tooltip Text / injectTimePulse + + +import ogre.renderer.OGRE as ogre +import ogre.gui.CEGUI as cegui +import SampleFramework + +from CEGUI_framework import * + + +CONTAINER_POS = 0.05 +CONTAINER_SIZE = 0.90 + +def createUVector2( x, y): + return CEGUI.UVector2(cegui.UDim(x,0), cegui.UDim(y,0)) + + +def CreateControl(widget_name,name,parent,pos,size,text='',showframe=False): + + control = cegui.WindowManager.getSingleton().createWindow(widget_name, name) + parent.addChildWindow(control) + control.setPosition (createUVector2( pos[0],pos[1]) ) + control.setSize(createUVector2(size[0], size[1])) + control.minimumSize = cegui.Size(0.01,0.01) + control.maximumSize = cegui.Size(1.0,1.0) + control.text = text + control.frameEnabled = showframe + return control + + + +# Drag and Drop Events +def handleDragEnter(args): + + # set frame colour for window on drag enter + args.window.setProperty("FrameColours", "tl:FF00FF00 tr:FF00FF00 bl:FF00FF00 br:FF00FF00") + return True + +def handleDragLeave(args): + # change to mouse move cursor + cegui.System.getSingleton().setDefaultMouseCursor("TaharezLook", "MouseMoveCursor") + + # reset frame colours + args.window.setProperty("FrameColours", "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") + return True + +def handleDragDropped(args): + + # change to normal mouse cursor + cegui.System.getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow") + # set frame colour and add image to frame static grid + args.window.setProperty("FrameColours", "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") + args.window.addChildWindow(args.dragDropItem) + args.dragDropItem.position = CEGUI.UVector2(cegui_reldim (CONTAINER_POS), cegui_reldim (CONTAINER_POS)) + args.dragDropItem.setSize(CEGUI.UVector2(cegui_reldim(CONTAINER_SIZE), cegui_reldim(CONTAINER_SIZE))) + print "UserData:",args.window.getUserData() + + return True + +def onMouseEnters(args): + #print "You have Mouse Entery" + # change to mouse move cursor + cegui.System.getSingleton().setDefaultMouseCursor("TaharezLook", "MouseMoveCursor") + + +def onMouseLeaves(args): + #print "You have Mouse Left" + # change to mouse move cursor + cegui.System.getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow") + + + + +class GEUIApplication(SampleFramework.Application): + + def __init__(self): + SampleFramework.Application.__init__(self) + self.guiRenderer=0 + self.system =0 + self.img = [] # static images for frames + self.ec = [] # events for each static image + self.ec1 = 0 # events for icon image change mouse cursor + self.ec2 = 0 + self.keep=[] + + def _createGUI(self): + + # initiaslise CEGUI Renderer + self.guiRenderer = cegui.OgreCEGUIRenderer(self.renderWindow,ogre.RenderQueueGroupID.RENDER_QUEUE_OVERLAY, False, 3000, self.sceneManager) + self.system = cegui.System(self.guiRenderer) + cegui.Logger.getSingleton().loggingLevel = cegui.Insane + + # load TaharezLook scheme + cegui.SchemeManager.getSingleton().loadScheme("TaharezLookSkin.scheme") + self.system.setDefaultMouseCursor("TaharezLook", "MouseArrow") + + # default layout + sheet = cegui.WindowManager.getSingleton().createWindow("DefaultWindow", "root_wnd") + self.system.setGUISheet (sheet) + + # control colours + blue = cegui.colour(0.0, 0.0, 1.0, 0.5) + red = cegui.colour(1.0, 0.0, 0.0, 0.5) + green = cegui.colour(0.0, 1.0, 0.0, 1.0) + blue_back = cegui.colour(0.0, 0.0, 1.0, 1.0) + red_back = cegui.colour(1.0, 0.0, 0.0, 1.0) + + + # setup tooltip + self.system.setDefaultTooltip("TaharezLook/Tooltip" ) + tip = self.system.getDefaultTooltip() + + # displayTime + # the number of seconds the tooltip should be displayed for before it automatically + # de-activates itself. + # 0 indicates that the tooltip should never timesout and auto-deactivate. + # hoverTime + # the number of seconds the mouse should hover stationary over the target window + # before the tooltip gets activated. + # fadeTime + # number of seconds that should be taken to fade the tooltip into and out of + # visibility. + + #tip.displayTime=0.80 + tip.hoverTime = 0.10 + tip.fadeTime=1.0 + + # an edit box + editBox = CreateControl("TaharezLook/MultiLineEditbox", "an edit control",sheet,[0.10,0.80],[0.80,0.80],'') + editBox.text="The above static text control was created using UDIM" + editBox.text+="UDIM is the new 'unified' co-ord system replacement for relative/absolute coords" + editBox.text+=" The basic concept is UDIM(scale,offset) where:" + editBox.text+=" scale is the relative component usually 0.0 to 1.0" + editBox.text+=" offset is the absolute component in pixels " + editBox.readOnly=True + + # create static text box UDIM + stat =cegui.WindowManager.getSingleton().createWindow("TaharezLook/StaticText", "Label") + stat.windowHeight=cegui.UDim(0.05,0) # %window parents height,offset pixels parent + stat.windowWidth=cegui.UDim(0.80,0) # %window parents width, offset pixels parent + stat.windowXPosition = cegui.UDim(0.10,0) # %position parent window width,offset pixels parent + stat.windowYPosition = cegui.UDim(0.05,0) # %position parent window height,offset pixels parent + stat.text = "Drag Above Icon to different cells in frame window" + img = cegui.ImagesetManager.getSingleton().getImageset("TaharezLook").getImage("ListboxSelectionBrush") + stat.backgroundImage = img + stat.backgroundColours = cegui.ColourRect(red,red,red,red) #colrect + stat.textColours = (1.0,1.0,1.0) # white + stat.frameColours = blue + stat.horizontalFormatting=cegui.Centred # LeftAligned + + #sheet.addChildWindow(stat) + + # creates first frame window + frs=cegui.WindowManager.getSingleton().createWindow("TaharezLook/FrameWindow", "Rucksack") + frs.setPosition (CEGUI.UVector2(cegui_reldim (0.03), cegui_reldim (0.05))) + frs.setSize(CEGUI.UVector2(cegui_reldim(0.45), cegui_reldim(0.6))) + frs.text = "Test Frame" + sheet.addChildWindow(frs) + + # creates second frame window + feq=cegui.WindowManager.getSingleton().createWindow("TaharezLook/FrameWindow", "Equipped Items") + feq.setPosition (CEGUI.UVector2(cegui_reldim (0.5), cegui_reldim (0.05))) + feq.setSize(CEGUI.UVector2(cegui_reldim(0.45), cegui_reldim(0.6))) + feq.text = "Test Frame 2" + sheet.addChildWindow(feq) + + # add a number of 'slots' to each frame window + # the slots will act as targets for drag/drop + # the slots ust normal StaticText widgets with the relevant event handlers attached + + # create 4x4 staic image grid for each frame + cols = 4 + rows = 4 + deltax=1.0/cols + deltay=1.0/rows + + for x in [frs,feq]: + for xp in range(cols): + for yp in range(rows): + name = "Slot" + str(xp) + str(yp) + x.name.c_str() + self.keep.append(name) + c = CreateControl("TaharezLook/StaticImage",name,x,[xp*deltax,yp*deltay],[deltax,deltay],'Image1',1) + c.setUserData (name) + print "UserData:",c.getUserData() + + self.img.append(c) + + # create events for each slot + for slot in self.img: + self.ec.append(slot.subscribeEvent(slot.EventDragDropItemEnters, handleDragEnter,"")) + self.ec.append(slot.subscribeEvent(slot.EventDragDropItemLeaves, handleDragLeave,"")) + self.ec.append(slot.subscribeEvent(slot.EventDragDropItemDropped, handleDragDropped,"")) + + + # create a drag/drop container + item=cegui.WindowManager.getSingleton().createWindow("DragContainer", "theItem") + item.position = CEGUI.UVector2(cegui_reldim (CONTAINER_POS), cegui_reldim (CONTAINER_POS)) + item.setSize(CEGUI.UVector2(cegui_reldim(CONTAINER_SIZE), cegui_reldim(CONTAINER_SIZE))) + + + + # create a static iamge as drag container's contents and parent to drag container + itemIcon=cegui.WindowManager.getSingleton().createWindow("TaharezLook/StaticImage", "theContainer") + itemIcon.setPosition (CEGUI.UVector2(cegui_reldim (0.0), cegui_reldim (0.0)) ) + itemIcon.setSize(CEGUI.UVector2(cegui_reldim(1.0), cegui_reldim(1.0))) + + # set image + itemIcon.setProperty("Image", "set:TaharezLook image:CloseButtonNormal") + # disable to allow inputs to pass through. + itemIcon.disable + itemIcon.tooltipText ="Drag Me" + + # add itemIcon to drag drop container + item.addChildWindow(itemIcon) + + # events to change mouse cursor + self.ec1= item.subscribeEvent(item.EventMouseEnters,onMouseEnters, "") + self.ec2= item.subscribeEvent(item.EventMouseLeaves,onMouseLeaves, "") + + # set starting slot for the item + startslot=self.img[0] + startslot.addChildWindow(item) + + + def _createScene(self): + sceneManager = self.sceneManager + sceneManager.ambientLight = ogre.ColourValue(0.25, 0.25, 0.25) + self._createGUI() + + + def _createCamera(self): + self.camera = self.sceneManager.createCamera("PlayerCam") + self.camera.nearClipDistance = 5 + + def _createFrameListener(self): + self.frameListener = CEGUIFrameListener(self.renderWindow, self.camera, self.sceneManager) + self.root.addFrameListener(self.frameListener) + self.frameListener.showDebugOverlay(True) + + def __del__(self): + "Clear variables, this is needed to ensure the correct order of deletion" + del self.camera + del self.sceneManager + del self.frameListener + del self.system + del self.guiRenderer + del self.root + del self.renderWindow + +class CEGUIFrameListener(GuiFrameListener): + + def __init__(self, renderWindow, camera, sceneManager): + GuiFrameListener.__init__(self, renderWindow, camera, sceneManager) + + self.keepRendering = True # whether to continue rendering or not + + def frameStarted(self, evt): + # injectTimePulse needed when using tooltips + cegui.System.getSingleton().injectTimePulse( evt.timeSinceLastFrame) + return GuiFrameListener.frameStarted(self,evt) + + + +if __name__ == '__main__': + try: + ta = GEUIApplication() + ta.go() + except ogre.OgreException, e: + print e Added: trunk/python-ogre/demos/cegui/Demo_CEGUI_Facial.py =================================================================== --- trunk/python-ogre/demos/cegui/Demo_CEGUI_Facial.py (rev 0) +++ trunk/python-ogre/demos/cegui/Demo_CEGUI_Facial.py 2007-10-03 06:30:20 UTC (rev 407) @@ -0,0 +1,220 @@ +# =============================================================== +# +# TODO: +# +# +# =============================================================== + + +import ogre.renderer.OGRE as ogre +import ogre.gui.CEGUI as cegui +import SampleFramework + +from CEGUI_framework import * + +SI_COUNT=18 +poseIndexes=[ 1, 2, 3, 4, 7, 8, 6, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] + +scrollbarNames = [ "Facial/Happy_Scroll", + "Facial/Sad_Scroll", + "Facial/Angry_Scroll", + "Facial/A_Scroll", + "Facial/E_Scroll", + "Facial/I_Scroll", + "Facial/O_Scroll", + "Facial/U_Scroll", + "Facial/C_Scroll", + "Facial/W_Scroll", + "Facial/M_Scroll", + "Facial/L_Scroll", + "Facial/F_Scroll", + "Facial/T_Scroll", + "Facial/P_Scroll", + "Facial/R_Scroll", + "Facial/S_Scroll", + "Facial/TH_Scroll"] + +class ScrollbarIndex: + SI_HAPPY,SI_SAD , SI_ANGRY ,SI_A , SI_E ,SI_I ,SI_O ,SI_U ,SI_C ,SI_W ,SI_M ,SI_L ,SI_F, SI_T ,SI_P ,SI_R ,SI_S ,SI_TH , SI_COUNT =range(19) + + +class CEGUIFrameListener(GuiFrameListener): + + def __init__(self, renderWindow, camera, sceneManager,speakAnimState,speakManualState,manualKeyFrame): + + self.scrollbars=[0]*18 + self.connections = [] + + self.mPlayAnimation = False + self.speakAnimState = speakAnimState + self.speakManualState = speakManualState + self.manualKeyFrame = manualKeyFrame + + GuiFrameListener.__init__(self, renderWindow, camera, sceneManager) + self._setupGUI() + self._setupConnections() + self.MenuMode = True + + + def _setupGUI(self): + + # get main cegui anim window + wmgr = cegui.WindowManager.getSingleton() + main = wmgr.getWindow("FacialDemo") + main.enabled=True + # set up radio button event handling, initial state (Animation) + self.mPlayAnimation = True + + def _setupConnections(self): + + wmgr = cegui.WindowManager.getSingleton() + # set up anim slider event handling, initial state (disabled) + for i in xrange(0,SI_COUNT): + self.scrollbars[i] = wmgr.getWindow(scrollbarNames[i]) + self.connections.append(self.scrollbars[i].subscribeEvent(self.scrollbars[i].EventThumbTrackEnded, self, "handleScrollChanged")) + self.scrollbars[i].setEnabled(False) + btn = wmgr.getWindow("Facial/Radio/Play") + btn.selected=True + self.connections.append(btn.subscribeEvent(btn.EventSelectStateChanged, self, "handleRadioChanged")) + + def frameStarted(self, evt): + ok = GuiFrameListener.frameStarted(self,evt) + if ok: + self.speakAnimState.addTime(evt.timeSinceLastFrame) + return ok + + # scrollbars event handler + def handleScrollChanged(self,args): + if (not self.mPlayAnimation): + #Alter the animation + name = args.window.name.c_str() ## Note that you need to extract the string + #Find which pose was changed + for i in xrange(0,SI_COUNT): + if (scrollbarNames[i] == name): + break + if (i != SI_COUNT): + #Update the pose + self.manualKeyFrame.updatePoseReference( + poseIndexes[i], self.scrollbars[i].getScrollPosition() ) #scrollPosition) + #Dirty animation state since we're fudging this manually + self.speakManualState.getParent()._notifyDirty() + + return True + + # radio button event handler switch betweens manual/auto animation + def handleRadioChanged(self,args): + self.mPlayAnimation = not self.mPlayAnimation + self.speakAnimState.setEnabled(self.mPlayAnimation) + self.speakManualState.setEnabled(not self.mPlayAnimation) + for i in xrange(0,SI_COUNT): + self.scrollbars[i].setEnabled(not self.mPlayAnimation) + return True + + +class FacialAnimationApplication(SampleFramework.Application): + + def __init__(self): + SampleFramework.Application.__init__(self) + self.guiRenderer=0 + self.system =0 + self.speakAnimState = None + self.manualAnimState = None + self.manualKeyFrame = None + self.mesh = None + + + def _createGUI(self): + + # Initiaslise CEGUI Renderer + self.guiRenderer = cegui.OgreCEGUIRenderer(self.renderWindow,ogre.RENDER_QUEUE_OVERLAY, False, 3000, self.sceneManager) + + # create cegui system and log name facial.log + self.system = cegui.System(self.guiRenderer) + cegui.Logger.getSingleton().loggingLevel = cegui.Insane + + # Load Cegui Scheme + cegui.SchemeManager.getSingleton().loadScheme("TaharezLookSkin.scheme") + self.system.setDefaultMouseCursor("TaharezLook", "MouseArrow") + self.system.setDefaultFont("BlueHighway-12") + + # Load Layout + sheet = cegui.WindowManager.getSingleton().loadWindowLayout("facial.layout") + self.system.setGUISheet (sheet) + sheet.enabled=True + + def _createScene(self): + sceneManager = self.sceneManager + sceneManager.ambientLight = ogre.ColourValue(0.25, 0.25, 0.25) + + # Create a light + l = sceneManager.createLight("MainLight") + #Accept default settings: point light, white diffuse, just set position + #NB I could attach the light to a SceneNode if I wanted it to move automatically with + #other objects, but I don't + l.setPosition(ogre.Vector3(20,80,50)) + l.setDiffuseColour(ogre.ColourValue(1.0, 1.0, 1.0)) + + # create a light + l = sceneManager.createLight("MainLight2") + l.setPosition (ogre.Vector3(-120,-80,-50)) + l.setDiffuseColour(ogre.ColourValue(0.7, 0.7, 0.6)) + + + # pre-load the mesh so that we can tweak it with a manual animation + mesh = ogre.MeshManager.getSingleton().load("facial.mesh", 'General') + anim = mesh.createAnimation("manual", 0) + track = anim.createVertexTrack(4, ogre.VAT_POSE) + self.manualKeyFrame = track.createVertexPoseKeyFrame(0) + manualKeyFrame=self.manualKeyFrame + + # create pose references, initially zero + for i in xrange(0,SI_COUNT): + manualKeyFrame.addPoseReference(poseIndexes[i], 0.0) + + head = sceneManager.createEntity("Head", "facial.mesh") + self.speakAnimState = head.getAnimationState("Speak") + self.speakAnimState.enabled=True + self.manualAnimState = head.getAnimationState("manual") + self.manualAnimState.timePosition=0 + + headNode = sceneManager.rootSceneNode.createChildSceneNode() + headNode.attachObject(head) + + self.camera.setPosition( ogre.Vector3(-20, 50, 150) ) + self.camera.lookAt( ogre.Vector3(0,35,0) ) + + self._createGUI() + + + + def _createCamera(self): + self.camera = self.sceneManager.createCamera("PlayerCam") + self.camera.setNearClipDistance(5) + + def _createFrameListener(self): + self.frameListener = CEGUIFrameListener(self.renderWindow, self.camera, self.sceneManager, + self.speakAnimState,self.manualAnimState,self.manualKeyFrame) + self.root.addFrameListener(self.frameListener) + self.frameListener.showDebugOverlay(True) + + def __del__(self): + "Clear variables, this is needed to ensure the correct order of deletion" + del self.camera + del self.sceneManager + del self.frameListener + del self.system + del self.guiRenderer + del self.root + del self.renderWindow + + +if __name__ == '__main__': + try: + ta = FacialAnimationApplication() + ta.go() + except ogre.OgreException, e: + print e + + + + Added: trunk/python-ogre/demos/cegui/Demo_CEGUI_Gui.py =================================================================== --- trunk/python-ogre/demos/cegui/Demo_CEGUI_Gui.py (rev 0) +++ trunk/python-ogre/demos/cegui/Demo_CEGUI_Gui.py 2007-10-03 06:30:20 UTC (rev 407) @@ -0,0 +1,375 @@ +# /* +# ----------------------------------------------------------------------------- +# This source file is part of OGRE +# (Object-oriented Graphics Rendering Engine) +# For the latest info, see http:##www.ogre3d.org/ + +# Copyright (c) 2000-2006 Torus Knot Software Ltd +# Also see acknowledgements in Readme.html + +# You may use self sample code for anything you like, it is not covered by the +# LGPL like the rest of the engine. +# ----------------------------------------------------------------------------- +# */ + +import ogre.renderer.OGRE as ogre +import ogre.gui.CEGUI as CEGUI +import ogre.io.OIS as OIS +import SampleFramework + +import sys, exceptions, random + +from CEGUI_framework import * ## we need the OIS version of the framelistener etc + +class GuiApplication ( SampleFramework.Application ): + + def __init__(self): + SampleFramework.Application.__init__(self) + self.GUIRenderer=0 + self.GUIsystem =0 + self.EditorGuiSheet=0 + self.DescriptionMap={} + self.ListItems = [] # used to hold objects that in C++ code would be created with "new" + + # used for adding individual objects + self.windowNumber = 0 + self.vertScrollNumber = 0 + self.horizScrollNumber = 0 + self.textScrollNumber = 0 + self.siCounter = 0 + self.rttCounter=0 + + self.DescriptionMap[ "Demo8"] = "The main containing panel" + self.DescriptionMap[ "Demo8/Window1"] = "A test window" + self.DescriptionMap[ "Demo8/Window1/Listbox"] = "A list box" + self.DescriptionMap[ "Demo8/Window1/Controls/Red"] = "A colour slider" + self.DescriptionMap[ "Demo8/Window1/Controls/Green"] = "A colour slider" + self.DescriptionMap[ "Demo8/Window1/Controls/Blue"] = "A colour slider" + self.DescriptionMap[ "Demo8/Window1/Controls/ColourSample"] = "The colour that will be used for the selection when added to the list" + self.DescriptionMap[ "Demo8/Window1/Controls/Editbox"] = "An edit box self text will be added to the list" + self.DescriptionMap[ "Demo8/Window1/Controls/Add"] = "Adds the text to the list" + self.DescriptionMap[ "Demo8/Window1/Controls/ins1"] = "Some static text" + + def __del__(self): + ## + ## important that things get deleted int he right order + ## + + ## we could delete self.listitems however it should happen automagically + del self.camera + del self.sceneManager + del self.frameListener + try: + if self.EditorGuiSheet: + CEGUI.WindowManager.getSingleton().destroyWindow(self.EditorGuiSheet) + except: + pass + del self.GUIsystem + del self.GUIRenderer + del self.root + del self.renderWindow + + ## Just override the mandatory create scene method + def _createScene(self): + sceneManager = self.sceneManager + sceneManager.ambientLight = ogre.ColourValue(0.5, 0.5, 0.5) + + ## Create a skydome + self.sceneManager.setSkyDome(True, "Examples/CloudySky", 5, 8) + + ## Create a light + l = self.sceneManager.createLight("MainLight") + ## Accept default settings: point light, white diffuse, just set position + ## NB I could attach the light to a SceneNode if I wanted it to move automatically with + ## other objects, but I don't + l.setPosition(20,80,50) + + ## setup GUI system + self.GUIRenderer = CEGUI.OgreCEGUIRenderer(self.renderWindow, + ogre.RENDER_QUEUE_OVERLAY, False, 3000, self.sceneManager) + + self.GUIsystem = CEGUI.System(self.GUIRenderer) + + logger = CEGUI.Logger.getSingleton() + level = CEGUI.Informative + logger.setLoggingLevel(level) + + ogreHead = self.sceneManager.createEntity("Head", "ogrehead.mesh") + + headNode = self.sceneManager.getRootSceneNode().createChildSceneNode() + headNode.attachObject(ogreHead) + + + ## Setup Render To Texture for preview window + rttTex = self.root.getRenderSystem().createRenderTexture( "RttTex", 512, 512, ogre.TextureType.TEX_TYPE_2D, ogre.PixelFormat.PF_R8G8B8 ) + rttCam = self.sceneManager.createCamera("RttCam") + camNode = self.sceneManager.getRootSceneNode().createChildSceneNode("rttCamNode") + camNode.attachObject(rttCam) + rttCam.setPosition(0,0,200) + ##rttCam.setVisible(True) + v = rttTex.addViewport( rttCam ) + v.setOverlaysEnabled(False) + v.setClearEveryFrame( True ) + v.setBackgroundColour( ogre.ColourValue.Black ) + + + ## Retrieve CEGUI texture for the RTT + rttTexture = self.GUIRenderer.createTexture( "RttTex") + + rttImageSet = CEGUI.ImagesetManager.getSingleton().createImageset("RttImageset", rttTexture) + + rttImageSet.defineImage( "RttImage", + CEGUI.Point(0.0, 0.0), + CEGUI.Size(rttTexture.getWidth(), rttTexture.getHeight()), + CEGUI.Point(0.0,0.0)) + + ## load scheme and set up defaults + CEGUI.SchemeManager.getSingleton().loadScheme("TaharezLookSkin.scheme") + self.GUIsystem.setDefaultMouseCursor("TaharezLook", "MouseArrow") + self.GUIsystem.setDefaultFont( "BlueHighway-12") + + sheet = CEGUI.WindowManager.getSingleton().loadWindowLayout("ogregui.layout") + self.GUIsystem.setGUISheet(sheet) + +# +## note that copies are not made for combo/list boxes so need to keep each item around +## hence the use of the array and setting AutoDelete to False... +# + objectComboBox = CEGUI.WindowManager.getSingleton().getWindow("OgreGuiDemo/TabCtrl/Page2/ObjectTypeList") + function = 0 + for title in ["FrameWindow", "Horizontal Scrollbar","Vertical Scrollbar", + "StaticText","StaticImage","Render to Texture"] : + item = CEGUI.ListboxTextItem( title, function ) # create the item + item.AutoDeleted = False # ensure Python is in control of it's "deletion" + objectComboBox.addItem(item) # add the item to the combo list + self.ListItems.append(item) # ensure the item stays around until we decide to delete it + function += 1 # a simple flag so we know what to create when this is selected + + self.setupEventHandlers() + + + ## Create new frame listener + def _createFrameListener(self): + self.frameListener = GuiFrameListener(self.renderWindow, self.camera, self.GUIRenderer) #self.sceneManager) + self.frameListener.MenuMode = True # this stop the camera moving with the mouse cursor.. + + self.root.addFrameListener(self.frameListener) + self.frameListener.showDebugOverlay(False) + + + def setupEventHandlers(self): + wmgr = CEGUI.WindowManager.getSingleton() + + wmgr.getWindow( "OgreGuiDemo/TabCtrl/Page1/QuitButton").subscribeEvent( + CEGUI.PushButton.EventClicked, self, "handleQuit") + wmgr.getWindow( "OgreGuiDemo/TabCtrl/Page1/NewButton").subscribeEvent( + CEGUI.PushButton.EventClicked, self, "handleNew") + wmgr.getWindow( "OgreGuiDemo/TabCtrl/Page1/LoadButton").subscribeEvent( + CEGUI.PushButton.EventClicked, self, "handleLoad") + wmgr.getWindow("OgreGuiDemo/TabCtrl/Page2/ObjectTypeList").subscribeEvent( + CEGUI.Combobox.EventListSelectionAccepted, self, "handleObjectSelection"); + + + def setupEnterExitEvents(self, win): + win.subscribeEvent( + CEGUI.Window.EventMouseEnters, + self, "handleMouseEnters") + win.subscribeEvent( + CEGUI.Window.EventMouseLeaves, + self, "handleMouseLeaves") + for i in range (win.getChildCount()): + child = win.getChildAtIdx(i) + self.setupEnterExitEvents(child) + + def setupLoadedLayoutHandlers(self): + wmgr = CEGUI.WindowManager.getSingleton() + self.Red = wmgr.getWindow( "Demo8/Window1/Controls/Red") + self.Green = wmgr.getWindow( "Demo8/Window1/Controls/Green") + self.Blue = wmgr.getWindow( "Demo8/Window1/Controls/Blue") + self.Preview = wmgr.getWindow( "Demo8/Window1/Controls/ColourSample") + self.List = wmgr.getWindow( "Demo8/Window1/Listbox") + self.EditBox = wmgr.getWindow( "Demo8/Window1/Controls/Editbox") + self.Tip = wmgr.getWindow( "Demo8/Window2/Tips") + + self.Red.subscribeEvent( + CEGUI.Scrollbar.EventScrollPositionChanged, + self, "handleColourChanged") + self.Green.subscribeEvent( + CEGUI.Scrollbar.EventScrollPositionChanged, + self, "handleColourChanged") + self.Blue.subscribeEvent( + CEGUI.Scrollbar.EventScrollPositionChanged, + self, "handleColourChanged") + wmgr.getWindow( "Demo8/Window1/Controls/Add").subscribeEvent( + CEGUI.PushButton.EventClicked, + self, "handleAdd") + + root = wmgr.getWindow("Demo8") + self.setupEnterExitEvents(root) + + def createRttGuiObject(self): + guiObjectName = "NewRttImage" + str(self.rttCounter) + + rttImageSet = CEGUI.ImagesetManager.getSingleton().getImageset("RttImageset") + si = CEGUI.WindowManager.getSingleton().createWindow( "TaharezLook/StaticImage", guiObjectName) + si.setSize(CEGUI.UVector2( CEGUI.UDim(0.5, 0), CEGUI.UDim(0.4, 0))) + si.setProperty("Image", CEGUI.PropertyHelper.imageToString(rttImageSet.getImage( "RttImage"))) + self.rttCounter += 1 + return si + + def createStaticImageObject(self): + guiObjectName = "NewStaticImage" + str(self.siCounter) + + imageSet = CEGUI.ImagesetManager.getSingleton().getImageset("TaharezLook") + + si = CEGUI.WindowManager.getSingleton().createWindow( "TaharezLook/StaticImage", guiObjectName) + si.setSize(CEGUI.UVector2( CEGUI.UDim(0.2, 0), CEGUI.UDim(0.2, 0))) + si.setProperty("Image", CEGUI.PropertyHelper.imageToString(imageSet.getImage( "ClientBrush"))) + + self.siCounter+=1 + return si + + def handleQuit(self, e): + self.frameListener.requestShutdown() + return True + + + def handleNew(self, e): + if self.EditorGuiSheet: + CEGUI.WindowManager.getSingleton().destroyWindow(self.EditorGuiSheet) + + self.EditorGuiSheet = CEGUI.WindowManager.getSingleton().createWindow("DefaultGUISheet", "NewLayout") + + editorWindow = CEGUI.WindowManager.getSingleton().getWindow( "OgreGuiDemo2/MainWindow") + editorWindow.addChildWindow( self.EditorGuiSheet ) + + ## Test with the Euro symbol + special=CEGUI.String() + special.assign(8364) + #special=CEGUI.String(num=1,code_point=8364) # this makes a single char string with the unicode character + + ## and let's check some appending etc.. + f=CEGUI.String("Start") + temp=f.append(special,0,1) ## append the unicode string + end = CEGUI.String("End") + temp=temp.append(end,0,3) + editorWindow.text=temp + + ## Now for utf8 + utf8String = "\xc4\x8d Special 'C' showing utf8 capabilities \xc2\xa9 Python-Ogre\xe2\x84\xa2" + cs = CEGUI.String() + cs.assign ( utf8String ) + editorWindow.text=cs + + return True + + + def handleLoad(self, e): + if(self.EditorGuiSheet): + CEGUI.WindowManager.getSingleton().destroyWindow(self.EditorGuiSheet) + + self.EditorGuiSheet = CEGUI.WindowManager.getSingleton().loadWindowLayout("cegui8.layout") + self.setupLoadedLayoutHandlers() + + editorWindow = CEGUI.WindowManager.getSingleton().getWindow( "OgreGuiDemo2/MainWindow") + editorWindow.addChildWindow(self.EditorGuiSheet) + + return True + + + def handleObjectSelection(self, e): + guiObjectName ="" + + ## Set a random position to place self object. + posX = 0.7 * random.random() #(0.0, 0.7) + posY = 0.6 * random.random() + 0.1 #(0.1, 0.7) + item = e.window.getSelectedItem() #CEGUI.DoIt(e) + + editorWindow = CEGUI.WindowManager.getSingleton().getWindow( "OgreGuiDemo2/MainWindow") + + id = item.getID() + if id == 0: + guiObjectName = "NewWindow" + str(self.windowNumber) + window = CEGUI.WindowManager.getSingleton().createWindow( "TaharezLook/FrameWindow", guiObjectName) + window.setSize(CEGUI.UVector2(CEGUI.UDim(0.3,0), CEGUI.UDim(0.3,0))) + window.setText( "New Window") + self.windowNumber+=1 + elif id == 1: + guiObjectName = "NewHorizScroll" + str(self.horizScrollNumber) + window = CEGUI.WindowManager.getSingleton().createWindow( "TaharezLook/HorizontalScrollbar", guiObjectName) + window.setSize(CEGUI.UVector2(CEGUI.UDim(0.75,0), CEGUI.UDim(0.03,0))) + self.horizScrollNumber+=1 + elif id == 2: + guiObjectName = "NewVertScroll" + str(self.vertScrollNumber) + window = CEGUI.WindowManager.getSingleton().createWindow( "TaharezLook/VerticalScrollbar", guiObjectName) + window.setSize(CEGUI.UVector2(CEGUI.UDim(0.03,0), CEGUI.UDim(0.75,0))) + self.vertScrollNumber+=1 + elif id == 3: + guiObjectName = "NewStaticText" + str(self.textScrollNumber) + window = CEGUI.WindowManager.getSingleton().createWindow( "TaharezLook/StaticText", guiObjectName) + window.setSize(CEGUI.UVector2(CEGUI.UDim(0.25,0), CEGUI.UDim(0.1,0))) + window.setText( "Example static text") + self.textScrollNumber+=1 + elif id == 4: + window = self.createStaticImageObject() + elif id == 5: + window = self.createRttGuiObject() + + editorWindow.addChildWindow(window) + window.setPosition(CEGUI.UVector2(CEGUI.UDim(posX, 0), CEGUI.UDim(posY, 0))) + + return True + + def handleColourChanged( self, e): + self.Preview.setProperty("ImageColours", + CEGUI.PropertyHelper.colourToString(CEGUI.colour( + self.Red.getScrollPosition() / 255.0, + self.Green.getScrollPosition() / 255.0, + self.Blue.getScrollPosition() / 255.0))) + + return True + + def handleAdd(self, e): + listboxitem = CEGUI.ListboxTextItem (self.EditBox.getText()) + listboxitem.AutoDeleted = False # Fix to ensure that items are not deleted by the CEGUI system + listboxitem.setSelectionBrushImage("TaharezLook", "ListboxSelectionBrush") + if self.List.getItemCount() == 0: + listboxitem.setSelected( True ) + else: + listboxitem.setSelected( False ) + listboxitem.setSelectionColours( + CEGUI.PropertyHelper.stringToColourRect(self.Preview.getProperty("ImageColours"))) + self.List.addItem(listboxitem) + self.ListItems.append(listboxitem) # we need to keep the listitems around for the list box to work + return True + + def handleMouseEnters(self, e): + name = e.window.getName().c_str() + try: + self.Tip.setText( self.DescriptionMap[ name ]) + except: + self.Tip.setText( "" ) + return True + + def handleMouseLeaves(self, e): + self.Tip.setText( "") + return True + +def TestonKeyDown( e): + + ##find the static box + print"KEYDOWN" + print e + print dir(e) + + return True + +if __name__ == '__main__': + try: + ta = GuiApplication() + ta.go() + except ogre.OgreException, e: + print e + + + Added: trunk/python-ogre/demos/cegui/Demo_CEGUI_NewGui.py =================================================================== --- trunk/python-ogre/demos/cegui/Demo_CEGUI_NewGui.py (rev 0) +++ trunk/python-ogre/demos/cegui/Demo_CEGUI_NewGui.py 2007-10-03 06:30:20 UTC (rev 407) @@ -0,0 +1,431 @@ +# /* +# ----------------------------------------------------------------------------- +# This source file is part of OGRE +# (Object-oriented Graphics Rendering Engine) +# For the latest info, see http:##www.ogre3d.org/ + +# Copyright (c) 2000-2006 Torus Knot Software Ltd +# Also see acknowledgements in Readme.html + +# You may use self sample code for anything you like, it is not covered by the +# LGPL like the rest of the engine. +# ----------------------------------------------------------------------------- +# + +### +### This is a blank template to make it easier to convert existing samples +### + +import ogre.renderer.OGRE as ogre +import ogre.gui.CEGUI as CEGUI +import ogre.io.OIS as OIS +import SampleFramework + +import sys, exceptions, random + +from CEGUI_framework import * ## we need the OIS version of the framelistener etc + +def cegui_reldim ( x ) : + return CEGUI.UDim((x),0) + +class GuiApplication ( SampleFramework.Application ): + + def __init__(self): + SampleFramework.Application.__init__(self) + self.GUIRenderer=0 + self.GUIsystem =0 + self.EditorGuiSheet=0 + + def __del__(self): + ## + ## important that things get deleted int he right order + ## + del self.camera + del self.sceneManager + del self.frameListener + try: + if self.EditorGuiSheet: + CEGUI.WindowManager.getSingleton().destroyWindow(self.EditorGuiSheet) + except: + pass + del self.GUIsystem + del self.GUIRenderer + del self.root + del self.renderWindow + + + ## Just override the mandatory create scene method + def _createScene(self): + sceneManager = self.sceneManager + sceneManager.ambientLight = ogre.ColourValue(0.5, 0.5, 0.5) + + ## Create a skydome + self.sceneManager.setSkyDome(True, "Examples/CloudySky", 5, 8) + + ## Create a light + l = self.sceneManager.createLight("MainLight") + l.setPosition(20,80,50) + +# ## set the default resource groups to be used +# CEGUI.Imageset.setDefaultResourceGroup("imagesets") +# CEGUI.Font.setDefaultResourceGroup("fonts") +# CEGUI.Scheme.setDefaultResourceGroup("schemes") +# CEGUI.WidgetLookManager.setDefaultResourceGroup("looknfeels") +# CEGUI.WindowManager.setDefaultResourceGroup("layouts") +# CEGUI.ScriptModule.setDefaultResourceGroup("lua_scripts") +# + ## setup GUI system + self.GUIRenderer = CEGUI.OgreCEGUIRenderer(self.renderWindow, + ogre.RENDER_QUEUE_OVERLAY, False, 3000, self.sceneManager) + + + self.GUIsystem = CEGUI.System(self.GUIRenderer) + + logger = CEGUI.Logger.getSingleton() + logger.setLoggingLevel( CEGUI.Informative ) + + # we will make extensive use of the WindowManager. + winMgr = CEGUI.WindowManager.getSingleton() + + ## load scheme and set up defaults + CEGUI.SchemeManager.getSingleton().loadScheme("TaharezLookSkin.scheme") + self.GUIsystem.setDefaultMouseCursor("TaharezLook", "MouseArrow") + #CEGUI.FontManager.getSingleton().createFont("Commonwealth-10.font") + + ## load an image to use as a background + CEGUI.ImagesetManager.getSingleton().createImagesetFromImageFile("BackgroundImage", "ogregui.tga") + + ## here we will use a StaticImage as the root, then we can use it to place a background image + background = winMgr.createWindow("TaharezLook/StaticImage", "background_wnd") + ## set position and size + background.setPosition(CEGUI.UVector2(cegui_reldim(0), cegui_reldim( 0))) + background.setSize(CEGUI.UVector2(cegui_reldim(1), cegui_reldim( 1))) + ## disable frame and standard background + background.setProperty("FrameEnabled", "false") + background.setProperty("BackgroundEnabled", "false") + ## set the background image + background.setProperty("Image", "set:BackgroundImage image:full_image") + ## install this as the root GUI sheet + CEGUI.System.getSingleton().setGUISheet(background) + + ## now we create a DefaultWindow which we will attach all the widgets to. We could + ## have attached them to the background StaticImage, though we want to be a bit tricky + ## since we do not wish the background to be faded by the slider - so we create this + ## container window so we can affect all the other widgets, but leave the background + ## unchanged. + sheet = winMgr.createWindow("DefaultWindow", "root_wnd") + ## attach this to the 'real' root + background.addChildWindow(sheet) + + ## + ## widget initialisation + ## + ## quit button + btn = winMgr.createWindow("TaharezLook/Button", "QuitButton") + sheet.addChildWindow(btn) + btn.setText("Quit!") + btn.setPosition(CEGUI.UVector2(cegui_reldim(0.035), cegui_reldim( 0.0))) + btn.setSize(CEGUI.UVector2(cegui_reldim(0.1), cegui_reldim( 0.036))) + + btn.subscribeEvent(CEGUI.PushButton.EventClicked, self, "handleQuit") + btn.setAlwaysOnTop(True) + + ## Alpha-slider + slider = winMgr.createWindow("TaharezLook/Slider", "my slider") + sheet.addChildWindow(slider) + slider.setPosition(CEGUI.UVector2(cegui_reldim(0.136), cegui_reldim( 0.0))) + slider.setSize(CEGUI.UVector2(cegui_reldim(0.02), cegui_reldim( 0.075))) + slider.setAlwaysOnTop(True) + ## here we disable inherited alpha so that we will always be able to see the slider + slider.setInheritsAlpha(False) + ## set up slider config + slider.setCurrentValue(1.0) + slider.setClickStep(0.1) + ## subscribe handler that will process slider position changes. + slider.subscribeEvent(CEGUI.Slider.EventValueChanged, sliderHandler, "") + + ## big scroll bar + vscb = winMgr.createWindow("TaharezLook/LargeVerticalScrollbar", "Vert Scroll 1") + sheet.addChildWindow(vscb) + vscb.setPosition(CEGUI.UVector2(cegui_reldim(0.0), cegui_reldim( 0.0))) + vscb.setMinSize(CEGUI.UVector2(cegui_reldim(0.01), cegui_reldim( 0.01))) + vscb.setMaxSize(CEGUI.UVector2(cegui_reldim(1.0), cegui_reldim( 1.0))) + vscb.setSize(CEGUI.UVector2(cegui_reldim(0.035), cegui_reldim( 0.83))) + vscb.setDocumentSize(100) + vscb.setPageSize(5) + vscb.setStepSize(1) + vscb.setAlwaysOnTop(True) + + ## mini vert scroll bar + mvsb = winMgr.createWindow("TaharezLook/VerticalScrollbar", "MiniVertScroll 1") + sheet... [truncated message content] |
From: <and...@us...> - 2007-10-03 04:10:33
|
Revision: 406 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=406&view=rev Author: andy_miller Date: 2007-10-02 21:10:32 -0700 (Tue, 02 Oct 2007) Log Message: ----------- Missing files -- Navi Demo.. Added Paths: ----------- trunk/python-ogre/README trunk/python-ogre/convert.sed trunk/python-ogre/demos/media_extra/fish.ogg trunk/python-ogre/demos/media_extra/test.tst trunk/python-ogre/demos/navi/ trunk/python-ogre/demos/navi/Demo1_navi.py trunk/python-ogre/demos/navi/Demo_navi.py trunk/python-ogre/demos/navi/SampleFramework.py trunk/python-ogre/demos/navi/media.cfg trunk/python-ogre/demos/navi/ogre.cfg trunk/python-ogre/demos/navi/plugins.cfg trunk/python-ogre/demos/navi/resources.cfg trunk/python-ogre/demos/ogre/tests/Test_ManualMeshes.py trunk/python-ogre/demos/ogre/tests/Test_RenderOneFrame.py trunk/python-ogre/demos/ogre/tests/Test_WriteToTexture.py Added: trunk/python-ogre/README =================================================================== --- trunk/python-ogre/README (rev 0) +++ trunk/python-ogre/README 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,23 @@ +Please see http://python-ogre.python.hosting.com for info + +----- + +Copyright 2006-2007 The Python-Ogre Team. + +This file is part of Python-Ogre + +Python-Ogre is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +Python-Ogre is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Python-Ogre; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + Added: trunk/python-ogre/convert.sed =================================================================== --- trunk/python-ogre/convert.sed (rev 0) +++ trunk/python-ogre/convert.sed 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,25 @@ +# sedscript to convert C++ Ogre programs t0 python +# simple stuff - comments, -> and :: to ., true/false spelling, remove ;, remove trailing 'f' on floats +s/\-\>/\./ +s/\/\//##/ +s/\-\>/\./ +s/\:\:/\./ +s/true/True/ +s/false/False/ +s/NULL/None/ +s/this/self/ +s/;/ / +s/const// +#s/\(^W*\)Ogre::^w+\(^W*\)/\1/ +s/\([0-9]\)f/\1/ +# put trailing : after if and else +s/\(^\W*if.*$\)/\1:/ +s/\(^\W*else.*$\)/\1:/ +# open and closing braces on their own lines get removed +s/^\W*{\W*$// +s/^\W*}\W*$// + +# (r'^[\W]*{[\W]*$\n',''), +# (r'^[\W]*}[\W]*$\n',''), + #(r'void \W*(\w+)\(','def $1('), +## (r'^/\*.*\*/', 'special3') Added: trunk/python-ogre/demos/media_extra/fish.ogg =================================================================== (Binary files differ) Property changes on: trunk/python-ogre/demos/media_extra/fish.ogg ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/python-ogre/demos/media_extra/test.tst =================================================================== (Binary files differ) Property changes on: trunk/python-ogre/demos/media_extra/test.tst ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/python-ogre/demos/navi/Demo1_navi.py =================================================================== --- trunk/python-ogre/demos/navi/Demo1_navi.py (rev 0) +++ trunk/python-ogre/demos/navi/Demo1_navi.py 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,407 @@ +# For the latest inf +# +# You may use this sample code for anything you like, it is not covered by the +# LGPL. +# ----------------------------------------------------------------------------- +import ogre.renderer.OGRE as ogre +import ogre.gui.navi as navi +import ogre.io.OIS as OIS +import SampleFramework as sf + + +naviMgr = navi.NaviManager.Get() + +class NaviDemo(): + def __init__(self): + self.shouldQuit = False + self.renderWin = 0 + self.sceneMgr = 0 + + + def Startup( self ): + root = ogre.Root("./plugins.cfg", "./ogre.cfg", "./ogre.log") + if not root.restoreConfig(): + self.shouldQuit = not root.showConfigDialog() + if self.shouldQuit: + return + root.saveConfig() + self.root = root + self.renderWin = root.initialise(True, "NaviDemo") + + self.sceneMgr = root.createSceneManager("TerrainSceneManager", "NaviDemoSceneMgr") + self.sceneMgr.setAmbientLight(ogre.ColourValue(1, 1, 1)) + self.sceneMgr.setShadowTechnique(ogre.SHADOWTYPE_TEXTURE_ADDITIVE) + self.sceneMgr.setFog( ogre.FOG_LINEAR, ogre.ColourValue(0.9, 0.9, 1), 0.0, 0, 1550 ) + + camera = self.sceneMgr.createCamera("MainCam") + camera.setPosition(0,10,-15) + camera.lookAt(0, 0, 30) + viewport = self.renderWin.addViewport(camera) + viewport.setBackgroundColour(ogre.ColourValue(0.5, 0.5, 0.5)) + camera.setAspectRatio(viewport.getActualWidth() / viewport.getActualHeight()) + camera.setFarClipDistance( 1000 ) + camera.setNearClipDistance( 1 ) + camNode = self.sceneMgr.getRootSceneNode().createChildSceneNode("camNode") + camNode.attachObject(camera) + + if (root.getRenderSystem().getCapabilities().hasCapability(ogre.RSC_INFINITE_FAR_PLANE)): + camera.setFarClipDistance(0) + + light = self.sceneMgr.createLight( "Sun" ) + light.setType( ogre.Light.LT_DIRECTIONAL ) + light.setDiffuseColour( ogre.ColourValue( .82, .81, .7 ) ) + light.setSpecularColour( ogre.ColourValue( .82, .81, .7 ) ) + light.setDirection( ogre.Vector3( 0, -1, 1 ) ) + + self.parseResources() + + self.sceneMgr.setSkyDome( True, "CloudySky", 5, 6, 8 ) + + + ## Startup, create, and manage Navis + naviMgr.Startup(self.renderWin) + + naviMgr.createNavi("menubar", "local://menubar.html", navi.NaviPosition(navi.BottomCenter), 1024, 128, False) + naviMgr.setNaviMask("menubar", "navimenu_bg.png") +# # naviMgr.bind("menubar", "turnOn", NaviDelegate(this, &NaviDemo.turnOn), Strings("name")) +# # naviMgr.bind("menubar", "turnOff", NaviDelegate(this, &NaviDemo.turnOff), Strings("name")) +# # naviMgr.bind("menubar", "hpChange", NaviDelegate(this, &NaviDemo.hpChange), Strings("direction")) +# +# naviMgr.createNavi("status", "local:##status.html", navi.NaviPosition(0, 0), 512, 256, True, False) +# naviMgr.setNaviMask("status", "status_bg.png") +# # naviMgr.bind("status", "levelChanged", NaviDelegate(this, &NaviDemo.levelChanged), Strings("#level")) +# +# naviMgr.createNavi("chat", "http:##navi.agelessanime.com/chat", navi.NaviPosition(navi.BottomLeft, 40, -150), 512, 256, True, False) +# naviMgr.setNaviMask("chat", "navichat_bg.png") +# naviMgr.setNaviColorKey("chat", "#19001a", 0.7) +# # naviMgr.bind("chat", "messageSent", NaviDelegate(this, &NaviDemo.messageSent), Strings("nick")("message")) +# +# naviMgr.createNavi("equip", "local:##equip.html", navi.NaviPosition(navi.Right), 256, 512, True, False) +# naviMgr.setNaviMask("equip", "naviequip_bg.png") +# # naviMgr.bind("equip", "itemEquipped", NaviDelegate(this, &NaviDemo.itemEquipped), Strings("name")) +# +# ## Startup NaviMouse and create the cursors +# mouse = naviMgr.StartupMouse() +# mouse.createCursor("defaultCursor", 3, 2).addFrame(0, "cursor1.png") +# mouse.setDefaultCursor("defaultCursor") +# +# ## If you define a "move" cursor, NaviMouse will automatically use that when you move a Navi +# moveCursor = mouse.createCursor("move", 19, 19) +# moveCursor.addFrame(0, "cursorMove.png") +# + ## Create the ground + plane = ogre.Plane ( ogre.Vector3.UNIT_Y, 0) + ogre.MeshManager.getSingleton().createPlane("ground", + ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, plane, + 1500,1500,1,1,True,1,9,9,ogre.Vector3.UNIT_Z) + ent = self.sceneMgr.createEntity( "GroundEntity", "ground" ) + self.sceneMgr.getRootSceneNode().createChildSceneNode("GroundNode").attachObject(ent) + ent.setMaterialName("Terrain") + ent.setCastShadows(False) + + ## Create the Blue Knot + ent = self.sceneMgr.createEntity( "BlueMetalKnot", "knot.mesh" ) + ent.setMaterialName("Knot") + ent.setCastShadows( True ) + + ## Position and scale the Blue Knot + node = self.sceneMgr.getRootSceneNode().createChildSceneNode("KnotNode", ogre.Vector3(0, 12, 45)) + node.attachObject( ent ) + node.scale=(.07, .07, .07) + print "Done Startup" + + ##loadInputSystem() + + ##Ogre.WindowEventUtilities.addWindowEventListener(self.renderWin, this) + + def turnOn(naviData): + naviName = naviData["name"].str() + + if(naviName == "quit"): + self.shouldQuit = True + else: + naviMgr.resetNaviPosition(naviName) + naviMgr.showNavi(naviName, True) + + def turnOff(naviData): + naviMgr.hideNavi(naviData["name"].str(), True) + +# # # def hpChange(const NaviData &naviData) +# # # { +# # # static short curHP = 100 +# # # +# # # if(naviData["direction"].str() == "up") +# # # { +# # # curHP += (rand() % 30) + 1 +# # # if(curHP > 100) curHP = 100 +# # # std.stringstream setHP +# # # setHP << "setHP(" << curHP << ")" +# # # naviMgr.naviEvaluateJS("status", setHP.str()) +# # # } +# # # else +# # # { +# # # curHP -= (rand() % 30) + 1 +# # # if(curHP < 0) curHP = 0 +# # # std.stringstream setHP +# # # setHP << "setHP(" << curHP << ")" +# # # naviMgr.naviEvaluateJS("status", setHP.str()) +# # # } +# # # +# # # std.stringstream hpMsg +# # # hpMsg << "Navi Menubar: Current HP is now " << curHP << "%" +# # # +# # # LogManager.getSingleton().logMessage(hpMsg.str()) +# # # } +# # # +# # # void NaviDemo.messageSent(const NaviData &naviData) +# # # { +# # # naviMgr.naviEvaluateJS("status", "$('playerName').innerHTML = '" + naviData["nick"].str() + "'") +# # # LogManager.getSingleton().logMessage("Navi Chat: " + naviData["message"].str()) +# # # } +# # # +# # # void NaviDemo.itemEquipped(const NaviData &naviData) +# # # { +# # # LogManager.getSingleton().logMessage("Navi Equip: Item '" + naviData["name"].str() + "' equipped!") +# # # } +# # # +# # # void NaviDemo.levelChanged(const NaviData &naviData) +# # # { +# # # int level = naviData["level"].toInt() +# # # +# # # std.stringstream levelMsg +# # # levelMsg << "Navi Status: Level has been changed to: " << level << ", double that is: " << level * 2 +# # # +# # # LogManager.getSingleton().logMessage(levelMsg.str()) +# # # } + + def Update(self): + navi.NaviManager.Get().Update() + self.root.renderOneFrame() + self.updateStats() + ogre.WindowEventUtilities.messagePump() + ##InputManager.getSingletonPtr().capture() + + + + def Shutdown(self): + navi.NaviManager.Get().Shutdown() + ogre.Root.getSingleton().shutdown() + + def parseResources(self): + config = ogre.ConfigFile() + config.load('resources.cfg' ) + seci = config.getSectionIterator() + while seci.hasMoreElements(): + SectionName = seci.peekNextKey() + Section = seci.getNext() + for item in Section: + ogre.ResourceGroupManager.getSingleton().\ + addResourceLocation(item.value, item.key, SectionName) + ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups() + + +# /* void NaviDemo.loadInputSystem() +# { +# inputMgr = InputManager.getSingletonPtr() +# inputMgr.initialise(self.renderWin) +# inputMgr.addMouseListener(this, "NaviDemoMouseListener") +# inputMgr.addKeyListener(this, "NaviDemoKeyListener") +# }*/ + + def updateStats(self): + return + +if __name__ == '__main__': + try: + demo = NaviDemo() + demo.Startup() + + while not demo.shouldQuit: + demo.Update() + except ogre.OgreException, e: + print e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: trunk/python-ogre/demos/navi/Demo_navi.py =================================================================== --- trunk/python-ogre/demos/navi/Demo_navi.py (rev 0) +++ trunk/python-ogre/demos/navi/Demo_navi.py 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,150 @@ +# This code is in the Public Domain +# ----------------------------------------------------------------------------- +# This source file is part of Python-Ogre +# For the latest info, see http:##python-ogre.org/ +# +# It is likely based on original code from OGRE and/or PyOgre +# For the latest info, see http:##www.ogre3d.org/ +# +# You may use this sample code for anything you like, it is not covered by the +# LGPL. +# ----------------------------------------------------------------------------- +import ogre.renderer.OGRE as ogre +import ogre.gui.navi as navi +import ogre.io.OIS as OIS +import SampleFramework as sf +import random + +class NaviApplication(sf.Application, ogre.WindowEventListener): + def _createScene(self): + sceneManager = self.sceneManager + camera = self.camera + self.naviMgr = navi.NaviManager.Get() + self.shouldQuit = False # flag to allow the app to do a shutdown + + sceneManager.ambientLight = ogre.ColourValue(0.5, 0.5, 0.5) + sceneManager.setSkyDome(True, 'CloudySky', 5.0, 6, 8,) + light = sceneManager.createLight( "Sun" ) + light.setType( ogre.Light.LT_DIRECTIONAL ) + light.setDiffuseColour( ogre.ColourValue( .82, .81, .7 ) ) + light.setSpecularColour( ogre.ColourValue( .82, .81, .7 ) ) + light.setDirection( ogre.Vector3( 0, -1, -1 ) ) + + ## Create the Blue Knot + ent = sceneManager.createEntity( "BlueMetalKnot", "knot.mesh" ) + ent.setMaterialName("Knot") + ent.setCastShadows( True ) + + ## Position and scale the Blue Knot + node = sceneManager.getRootSceneNode().createChildSceneNode("KnotNode", ogre.Vector3(0, 0, 400)) + node.attachObject( ent ) + node.scale=(.2, .2, .2) + + ## Startup, create, and manage Navis + self.naviMgr.Startup(self.renderWindow) + + self.naviMgr.createNavi("menubar", "local://menubar.html", navi.NaviPosition(navi.BottomCenter), 1024, 128, False) + self.naviMgr.setNaviMask("menubar", "navimenu_bg.png") + self.naviMgr.bind("menubar", "turnOn", self, "turnOn", ["name"] ) + self.naviMgr.bind("menubar", "turnOff", self, "turnOff", ["name"] ) + self.naviMgr.bind("menubar", "hpChange", self,"hpChange", ["direction"] ) + + self.naviMgr.createNavi("status", "local://status.html", navi.NaviPosition(0, 0), 512, 256, True, False) + self.naviMgr.setNaviMask("status", "status_bg.png") + self.naviMgr.bind("status", "levelChanged", self,"levelChanged", ["#level"]) + + self.naviMgr.createNavi("chat", "http://navi.agelessanime.com/chat", navi.NaviPosition(navi.BottomLeft, 40, -150), 512, 256, True, False) + self.naviMgr.setNaviMask("chat", "navichat_bg.png") + self.naviMgr.setNaviColorKey("chat", "#19001a", 0.7) + self.naviMgr.bind("chat", "messageSent", self, "messageSent", ["nick","message"]) + + self.naviMgr.createNavi("equip", "local://equip.html", navi.NaviPosition(navi.Right), 256, 512, True, False) + self.naviMgr.setNaviMask("equip", "naviequip_bg.png") + self.naviMgr.bind("equip", "itemEquipped", self, "itemEquipped", ["name"]) + + ## Startup NaviMouse and create the cursors + mouse = self.naviMgr.StartupMouse() + mouse.createCursor("defaultCursor", 3, 2).addFrame(0, "cursor1.png") + mouse.setDefaultCursor("defaultCursor") + + ## If you define a "move" cursor, NaviMouse will automatically use that when you move a Navi + moveCursor = mouse.createCursor("move", 19, 19) + moveCursor.addFrame(0, "cursorMove.png") + self.curHP = 100 + + def turnOn(self, naviData): + naviName = naviData["name"].str() + if(naviName == "quit"): + self.shouldQuit = True + else: + self.naviMgr.resetNaviPosition(naviName) + self.naviMgr.showNavi(naviName, True) + + def turnOff(self, naviData): + self.naviMgr.hideNavi(naviData["name"].str(), True) + + def hpChange(self,naviData): + print "HPCHANGE" + if naviData["direction"].str() == "up": + self.curHP += (random.random() % 30) + 1 + if self.curHP > 100: self.curHP = 100 + self.naviMgr.naviEvaluateJS("status", "setHP(" + str(self.curHP)+")" ) + else: + self.curHP -= (random.random() % 30) + 1 + if self.curHP < 0: self.curHP = 0 + self.naviMgr.naviEvaluateJS("status", "setHP(" + str(self.curHP)+")" ) + + ogre.LogManager.getSingleton().logMessage("Navi Menubar: Current HP is now " + str(self.curHP)+"%") + + def messageSent(self, naviData): + self.naviMgr.naviEvaluateJS("status", "$('playerName').innerHTML = '" + naviData["nick"].str() + "'") + ogre.LogManager.getSingleton().logMessage("Navi Chat: " + naviData["message"].str()) + + def itemEquipped(self, naviData): + ogre.LogManager.getSingleton().logMessage("Navi Equip: Item '" + naviData["name"].str() + "' equipped!") + + def levelChanged(seld, naviData): + level = naviData["level"].toInt() +# levelMsg << "Navi Status: Level has been changed to: " << level << ", double that is: " << level * 2 +# LogManager.getSingleton().logMessage(levelMsg.str()) + + def _createFrameListener(self): + self.frameListener = frameListener(self.renderWindow, self.camera, self) + self.root.addFrameListener(self.frameListener) + +class frameListener(sf.FrameListener, OIS.MouseListener, OIS.KeyListener): + def __init__(self, renderWindow, camera,app): + sf.FrameListener.__init__(self, renderWindow, camera) + self.showDebugOverlay(False) # don't show the overlay + OIS.KeyListener.__init__(self) + OIS.MouseListener.__init__(self) + self.app = app + self.Mouse.setEventCallback(self) + self.MenuMode = True # stops the mouse moving the background + self.Keyboard.setEventCallback(self) + + def mouseMoved(self,arg): + if(arg.get_state().Z.rel != 0): + navi.NaviManager.Get().injectMouseWheel(arg.get_state().Z.rel) + return navi.NaviManager.Get().injectMouseMove(arg.get_state().X.abs, arg.get_state().Y.abs) + + def mousePressed(self, arg, id): + return navi.NaviManager.Get().injectMouseDown(id) + + def mouseReleased(self, arg, id): + return navi.NaviManager.Get().injectMouseUp(id) + + def frameStarted(self, frameEvent): + navi.NaviManager.Get().Update() + ret = sf.FrameListener.frameStarted(self, frameEvent) + if self.app.shouldQuit == True: ret = False # force the exit + if not ret: # we've been asked to exit + navi.NaviManager.Get().Shutdown() + return ret + +if __name__ == '__main__': + try: + application = NaviApplication() + application.go() + except ogre.OgreException, e: + print e Added: trunk/python-ogre/demos/navi/SampleFramework.py =================================================================== --- trunk/python-ogre/demos/navi/SampleFramework.py (rev 0) +++ trunk/python-ogre/demos/navi/SampleFramework.py 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,14 @@ +# This code is in the Public Domain +# + +import ogre.renderer.OGRE as ogre + +# We don't use the verisons but it's nice to set them up... +ogre.OgreVersion = ogre.GetOgreVersion() +ogre.OgreVersionString = ogre.OgreVersion[0] + ogre.OgreVersion[1] + ogre.OgreVersion[2] +ogre.PythonOgreVersion = ogre.GetPythonOgreVersion() + +from ogre.renderer.OGRE.sf_OIS import * + + + Added: trunk/python-ogre/demos/navi/media.cfg =================================================================== --- trunk/python-ogre/demos/navi/media.cfg (rev 0) +++ trunk/python-ogre/demos/navi/media.cfg 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1 @@ + Added: trunk/python-ogre/demos/navi/ogre.cfg =================================================================== --- trunk/python-ogre/demos/navi/ogre.cfg (rev 0) +++ trunk/python-ogre/demos/navi/ogre.cfg 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,19 @@ +Render System=Direct3D9 Rendering Subsystem + +[Direct3D9 Rendering Subsystem] +Allow NVPerfHUD=No +Anti aliasing=None +Floating-point mode=Fastest +Full Screen=No +Rendering Device=ATI MOBILITY RADEON +VSync=No +Video Mode=800 x 600 @ 32-bit colour + +[OpenGL Rendering Subsystem] +Colour Depth=32 +Display Frequency=N/A +FSAA=0 +Full Screen=No +RTT Preferred Mode=FBO +VSync=No +Video Mode=640 x 480 Added: trunk/python-ogre/demos/navi/plugins.cfg =================================================================== --- trunk/python-ogre/demos/navi/plugins.cfg (rev 0) +++ trunk/python-ogre/demos/navi/plugins.cfg 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,14 @@ +# Defines plugins to load + +# Define plugin folder +PluginFolder=../../plugins + +# Define plugins +Plugin=RenderSystem_Direct3D9 +Plugin=RenderSystem_GL +Plugin=Plugin_ParticleFX +Plugin=Plugin_BSPSceneManager +Plugin=Plugin_OctreeSceneManager +Plugin=Plugin_CgProgramManager + + Added: trunk/python-ogre/demos/navi/resources.cfg =================================================================== --- trunk/python-ogre/demos/navi/resources.cfg (rev 0) +++ trunk/python-ogre/demos/navi/resources.cfg 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,9 @@ +# Resource locations to be added to the 'boostrap' path +# This also contains the minimum you need to use the Ogre example framework +[Bootstrap] +Zip=../media/packs/OgreCore.zip + +# Resource locations to be added to the default path +[General] +FileSystem=Media +FileSystem=NaviLocal Added: trunk/python-ogre/demos/ogre/tests/Test_ManualMeshes.py =================================================================== --- trunk/python-ogre/demos/ogre/tests/Test_ManualMeshes.py (rev 0) +++ trunk/python-ogre/demos/ogre/tests/Test_ManualMeshes.py 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,209 @@ +import ogre.renderer.OGRE as ogre +import sys +import SampleFramework +import math + +class ManuallyDefinedMesh: + def __init__(self,Name, Vertices_Pos, Vertices_Norm, Faces, Vertices_Colour=None, CreateImediately=True): + """ An experimental class to define meshes programatically + 'Name' is the name by which the mesh will be referenced + Vertices_Pos, Vertices_Norm are botj lists of triplets + Faces is a simple list of vertex indices + Vertices_Colour is an optional list of ogre.ColourValue's + You can delay the mesh loading by setting 'CreateImediately' to False + Even if you assign colors to your vertexes, you will have to assign a + material to each entity created based on this mesh.""" + + assert len(Vertices_Pos)==len(Vertices_Norm) + assert (len(Faces)%3)==0 #Each face is defined by 3 consecutive vertex indices + + if Vertices_Colour is not None : + assert len(Vertices_Pos)==len(Vertices_Colour) + + meshMgr = ogre.MeshManager.getSingleton() + self.mesh = mesh = meshMgr.createManual(Name, ogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME) + self.subMesh = subMesh = mesh.createSubMesh() + + POSITION_ELEMENT = 0 + NORMAL_ELEMENT = 1 + UV_ELEMENT = 2 + COLOUR_ELEMENT = 0 + + self.Vertices_Pos = Vertices_Pos + self.Vertices_Norm = Vertices_Norm + self.Vertices_Colour = Vertices_Colour + + # ?????????????? / Not sure about this, without the get crash + mesh.sharedVertexData = ogre.VertexData() + mesh.sharedVertexData.vertexCount = len(Vertices_Pos) + + #work-around to prevent destruction + self.sharedVertexData = mesh.sharedVertexData + + declaration = mesh.sharedVertexData.vertexDeclaration + offset = 0 + offset += ogre.VertexElement.getTypeSize(ogre.VET_FLOAT3) + declaration.addElement(0, offset, ogre.VET_FLOAT3, ogre.VES_POSITION) + offset += ogre.VertexElement.getTypeSize(ogre.VET_FLOAT3) + + declaration.addElement(0, offset, ogre.VET_FLOAT3, ogre.VES_NORMAL) + offset += ogre.VertexElement.getTypeSize(ogre.VET_FLOAT3) + + hBuffMgr = ogre.HardwareBufferManager.getSingleton() + vbuf = hBuffMgr.createVertexBuffer(offset, mesh.sharedVertexData.vertexCount, + ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY) + + +# # pVertex = vbuf.lock(declaration, ogre.HardwareBuffer.HBL_DISCARD) + pVertex = vbuf.lock(ogre.HardwareBuffer.HBL_DISCARD) + + + #loop through the position array + for i in range(len(Vertices_Pos)): + vx, vy, vz = Vertices_Pos[i] + nx, ny, nz = Vertices_Norm[i] + + pVertex.setFloat(i, POSITION_ELEMENT, vx, vy, vz) + pVertex.setFloat(i, NORMAL_ELEMENT, nx, ny, nz) + bind = mesh.sharedVertexData.vertexBufferBinding + bind.setBinding(0,vbuf) #Set vertex buffer binding so buffer 0 is bound to positional data + + subMesh.indexData.indexCount = len(Faces) + subMesh.indexData.indexBuffer = hBuffMgr.createIndexBuffer(ogre.HardwareIndexBuffer.IT_16BIT, + len(Faces), ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY) + + ibuf = subMesh.indexData.indexBuffer + subMesh.indexData.indexBuffer.writeIndexes(0, Faces) + + vbuf.unlock() + + + #2nd buffer , colours + if Vertices_Colour is not None : + offset = 0 + declaration.addElement(1, offset, ogre.VET_COLOUR, ogre.VES_DIFFUSE) + offset += ogre.VertexElement.getTypeSize(ogre.VET_COLOUR) + vbuf = ogre.HardwareBufferManager.getSingleton().createVertexBuffer( + offset, mesh.sharedVertexData.vertexCount, ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY) +# # pVertex = vbuf.lock(declaration, ogre.HardwareBuffer.HBL_DISCARD) + pVertex = vbuf.lock(ogre.HardwareBuffer.HBL_DISCARD) + + for i in range(len(Vertices_Colour)): + pVertex.setColour(i, COLOUR_ELEMENT, Vertices_Colour[i]) + vbuf.unlock() + + #Set vertex buffer binding so buffer 1 is bound to our colour buffer + bind.setBinding(1, vbuf) + + subMesh.useSharedVertices = True + subMesh.indexData.indexBuffer = ibuf + subMesh.indexData.indexCount = len(Faces) + subMesh.indexData.indexStart = 0 + self.indexData = subMesh.indexData + + if CreateImediately: + self.MakeAvailable() + + def MakeAvailable(self,BoundBox=(None,None,None,None,None,None), BoundSphereRadius=None): + + if None in BoundBox: #Simple guess of the bounding box + xcoord = [i[0] for i in self.Vertices_Pos] + ycoord = [i[1] for i in self.Vertices_Pos] + zcoord = [i[2] for i in self.Vertices_Pos] + BoundBox = (min(xcoord),min(ycoord),min(zcoord),max(xcoord),max(ycoord),max(zcoord)) + + if BoundSphereRadius is None : #Very naive guess of the bounding sphere radius + BoundSphereRadius = max([abs(BoundBox[i+3]-BoundBox[i]) for i in range(3)]) + + mesh=self.mesh + + mesh._setBounds(ogre.AxisAlignedBox(*BoundBox)) + mesh._setBoundingSphereRadius(BoundSphereRadius) + + mesh.load() + + def Print(self): + mesh = self.mesh + print "Number SubMeshes",mesh.numSubMeshes + for i in range(mesh.numSubMeshes): + for f in (mesh.getSubMesh(i).indices): + print f + for v in ( mesh.getSubMesh(i).getVertices(ogre.Vector3(0.0,0.0,0.0), + ogre.Quaternion.IDENTITY, ogre.Vector3(1.0,1.0,1.0))): + print v + + +class TutorialApplication(SampleFramework.Application): + def _createScene(self): + sm = self.sceneManager + + self.headNode = sm.getRootSceneNode().createChildSceneNode('head1') + self.headNode.position=-70,0,0 + self.entity = sm.createEntity('head', 'ogrehead.mesh') + self.headNode.attachObject(self.entity) + + self.TestManual() + + def TestManual ( self ): + sqrt13 = 0.577350269 # sqrt(1/3) + x = 30.0 + y = 30.0 + z = 30.0 + vert_pos = [ + (-x,y,-z), #0 position + (x,y,-z), #1 position + (x,-y,-z), #2 position + (-x,-y,-z), #3 position + (-x,y,z), #4 position + (x,y,z), #5 position + (x,-y,z), #6 position + (-x,-y,z) #7 position + ] + vert_norm = [ + (-sqrt13,sqrt13,-sqrt13), #0 normal + (sqrt13,sqrt13,-sqrt13), #1 normal + (sqrt13,-sqrt13,-sqrt13), #2 normal + (-sqrt13,-sqrt13,-sqrt13), #3 normal + (-sqrt13,sqrt13,sqrt13), #4 normal + (sqrt13,sqrt13,sqrt13), #5 normal + (sqrt13,-sqrt13,sqrt13), #6 normal + (-sqrt13,-sqrt13,sqrt13) #7 normal + ] + faces = [ + 0,2,3, + 0,1,2, + 1,6,2, + 1,5,6, + 4,6,5, + 4,7,6, + 0,7,4, + 0,3,7, + 0,5,1, + 0,4,5, + 2,7,3, + 2,6,7] + + rs = self.root.getRenderSystem() +# colours=[] +# colours.append(rs.convertColourValue(ogre.ColourValue(1.0,0.0,0.0))) #0 colour +# colours.append(rs.convertColourValue(ogre.ColourValue(1.0,1.0,0.0))) #1 colour +# colours.append(rs.convertColourValue(ogre.ColourValue(0.0,1.0,0.0))) #2 colour +# colours.append(rs.convertColourValue(ogre.ColourValue(0.0,0.0,0.0))) #3 colour +# colours.append(rs.convertColourValue(ogre.ColourValue(1.0,0.0,1.0))) #4 colour +# colours.append(rs.convertColourValue(ogre.ColourValue(1.0,1.0,1.0))) #5 colour +# colours.append(rs.convertColourValue(ogre.ColourValue(0.0,1.0,1.0))) #6 colour +# colours.append(rs.convertColourValue(ogre.ColourValue(0.0,0.0,1.0))) #7 colour + + ManuallyDefinedMesh("cubeMesh",vert_pos,vert_norm,faces ) #,colours) + + self.cubeEntity = sceneManager.createEntity("myCubeEntity", "cubeMesh") + self.cubeEntity.setMaterialName("Test/SimpleVertexColor") + self.nd=sceneManager.rootSceneNode.createChildSceneNode() + self.nd.attachObject(self.cubeEntity) + + +if __name__ == '__main__': + ta = TutorialApplication() + ta.go() + + \ No newline at end of file Added: trunk/python-ogre/demos/ogre/tests/Test_RenderOneFrame.py =================================================================== --- trunk/python-ogre/demos/ogre/tests/Test_RenderOneFrame.py (rev 0) +++ trunk/python-ogre/demos/ogre/tests/Test_RenderOneFrame.py 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,9 @@ +import ogre.renderer.OGRE as ogre +class program: + def __init__(self): + self.root = ogre.Root("plugins.cfg","ogre.cfg","ogre.txt") + self.root.showConfigDialog() + self.root.initialise(True) +main = program() +while True: + main.root.renderOneFrame() \ No newline at end of file Added: trunk/python-ogre/demos/ogre/tests/Test_WriteToTexture.py =================================================================== --- trunk/python-ogre/demos/ogre/tests/Test_WriteToTexture.py (rev 0) +++ trunk/python-ogre/demos/ogre/tests/Test_WriteToTexture.py 2007-10-03 04:10:32 UTC (rev 406) @@ -0,0 +1,214 @@ +# This code is in the Public Domain +# ----------------------------------------------------------------------------- +# This source file is part of Python-Ogre +# For the latest info, see http:##python-ogre.org/ +# +# It is likely based on original code from OGRE and/or PyOgre +# For the latest info, see http:##www.ogre3d.org/ +# +# You may use this sample code for anything you like, it is not covered by the +# LGPL. +# ----------------------------------------------------------------------------- +import ogre.renderer.OGRE as ogre +import SampleFramework as sf +import ctypes + + + +def WriteToTexture(in_string, destTexture, destRectangle, font, color, justify = 'l', wordwrap = True): + if destTexture.getHeight() < destRectangle.bottom: + destRectangle.bottom = destTexture.getHeight() + if destTexture.getWidth() < destRectangle.right: + destRectangle.right = destTexture.getWidth() + + if not font.isLoaded(): + font.load() + + fontTexture = ogre.TextureManager.getSingleton().getByName\ + (font.getMaterial().getTechnique(0).getPass(0).getTextureUnitState(0).getTextureName()) + + fontBuffer = fontTexture.getBuffer() + destBuffer = destTexture.getBuffer() + + destPb = destBuffer.lock(destRectangle,ogre.HardwareBuffer.HBL_NORMAL) + + ## The font texture buffer was created write only...so we cannot read it back :o). + ## One solution is to copy the buffer instead of locking it. + ## (Maybe there is a way to create a font texture which is not write_only ?) + + ## create a buffer + nBuffSize = fontBuffer.getSizeInBytes() + ## Here we show the difference in C++ and Python + ## uint8* buff = (uint8*)calloc(nBuffSize, sizeof(uint8)) + storageclass = ctypes.c_uint8 * (nBuffSize) # allocate a buffer class + buff=storageclass() + + ## the PixelBox call needs a pointer to the buffer and here's how we do this in Python-Ogre + VoidPointer = ogre.CastVoidPtr(ctypes.addressof(buff)) + + ## create pixel box using the copy of the buffer + fontPb = ogre.PixelBox(fontBuffer.getWidth(), fontBuffer.getHeight(),fontBuffer.getDepth(), + fontBuffer.getFormat(), VoidPointer) + fontBuffer.blitToMemory(fontPb) + +# fontData = static_cast<uint8*>( fontPb.data ) +# destData = static_cast<uint8*>( destPb.data ) + + fontData = buff + + # we nede to know the size of the dest buffer so hopefully this is right + destSize = destPb.getConsecutiveSize() + destData = (ctypes.c_uint8 * (destSize)).from_address( ogre.CastInt(destPb.getData()) ) + + fontPixelSize = ogre.PixelUtil.getNumElemBytes(fontPb.format) + destPixelSize = ogre.PixelUtil.getNumElemBytes(destPb.format) + + fontRowPitchBytes = fontPb.rowPitch * fontPixelSize + destRowPitchBytes = destPb.rowPitch * destPixelSize + + GlyphTexCoords =[] + for i in range (len (in_string)): + GlyphTexCoords.append(ogre.Box()) # need a fixed size array in Python + + charheight = 0 + charwidth = 0 + + for i in range ( len(in_string) ): + if ((in_string[i] != '\t') and (in_string[i] != '\n') and (in_string[i] != ' ')): + glypheTexRect = font.getGlyphTexCoords(ord(in_string[i]) ) + GlyphTexCoords[i].left = int(glypheTexRect.left * fontTexture.getSrcWidth()) + GlyphTexCoords[i].top = int(glypheTexRect.top * fontTexture.getSrcHeight()) + GlyphTexCoords[i].right = int(glypheTexRect.right * fontTexture.getSrcWidth()) + GlyphTexCoords[i].bottom = int(glypheTexRect.bottom * fontTexture.getSrcHeight()) + + if (GlyphTexCoords[i].getHeight() > charheight): + charheight = GlyphTexCoords[i].getHeight() + if (GlyphTexCoords[i].getWidth() > charwidth): + charwidth = GlyphTexCoords[i].getWidth() + + cursorX = 0 + cursorY = 0 + lineend = destRectangle.getWidth() + carriagreturn = True + for strindex in range (len(in_string) ): + tchar = in_string[strindex] + if tchar == ' ': cursorX += charwidth + elif tchar == '\t':cursorX += charwidth * 3 + elif tchar == '\n': + cursorY += charheight + carriagreturn = True + else: + ##wrapping + if (cursorX + GlyphTexCoords[strindex].getWidth()> lineend) and not carriagreturn: + cursorY += charheight + carriagreturn = True + + ##justify + if (carriagreturn): + l = strindex + textwidth = 0 + wordwidth = 0 + while (l < len(in_string) ) and (in_string[l] != '\n)'): + wordwidth = 0 + if in_string[l] == ' ': + wordwidth = charwidth + l+=1 + elif in_string[l] == '\t': + wordwidth = charwidth *3 + l+=1 + elif in_string[l] == '\n': l = len(in_string) + + if wordwrap: + while((l < len(in_string)) and (in_string[l] != ' ') and (in_string[l] != '\t') and (in_string[l] != '\n')): + wordwidth += GlyphTexCoords[l].getWidth() + l+=1 + else: + wordwidth += GlyphTexCoords[l].getWidth() + l+=1 + + if ((textwidth + wordwidth) <= destRectangle.getWidth()): + textwidth += (wordwidth) + else: + break + + if ((textwidth == 0) and (wordwidth > destRectangle.getWidth())): + textwidth = destRectangle.getWidth() + + if justify == 'c': + cursorX = (destRectangle.getWidth() - textwidth)/2 + lineend = destRectangle.getWidth() - cursorX + + elif justify == 'r': + cursorX = (destRectangle.getWidth() - textwidth) + lineend = destRectangle.getWidth() + + else: + cursorX = 0 + lineend = textwidth + + carriagreturn = False + + ##abort - net enough space to draw + if ((cursorY + charheight) > destRectangle.getHeight()): + ## need to bail here + print "ERROR" + + ##draw pixel by pixel + for i in range ( GlyphTexCoords[strindex].getHeight() ): + for j in range (GlyphTexCoords[strindex].getWidth() ): + + index =(i + GlyphTexCoords[strindex].top) * fontRowPitchBytes + (j + GlyphTexCoords[strindex].left) * fontPixelSize +1 + fd = fontData[ index ] + alpha = color.a * (fd / 255.0) + invalpha = 1.0 - alpha + offset = (i + cursorY) * destRowPitchBytes + (j + cursorX) * destPixelSize + pix = ogre.ColourValue() + address = ctypes.addressof(destData) + offset + ogre.PixelUtil.unpackColour(pix,destPb.format,address) + pix = (pix * invalpha) + (color * alpha) + ogre.PixelUtil.packColour(pix,destPb.format,address) + + cursorX += GlyphTexCoords[strindex].getWidth() + + destBuffer.unlock() + + +class TestApplication(sf.Application): + def _createScene(self): + sceneManager = self.sceneManager + camera = self.camera + + sceneManager.ambientLight = ogre.ColourValue(0.5, 0.5, 0.5) + + background = ogre.TextureManager.getSingleton().getByName("ogretext.png") + + font = ogre.FontManager.getSingleton().getByName("BlueHighway") + + ## Make sure the texture is not WRITE_ONLY, we need to read the buffer to do the blending with the font (get the alpha for example) + texture = ogre.TextureManager.getSingleton().createManual("Write Texture","General", + ogre.TEX_TYPE_2D, 512, 512, ogre.MIP_UNLIMITED , + ogre.PF_X8R8G8B8, ogre.TU_STATIC|ogre.TU_AUTOMIPMAP) + + ## Draw the background to the new texture + texture.getBuffer().blit(background.getBuffer()) + + WriteToTexture("Andy was here!",texture,ogre.Box(25,275,370,500),font,ogre.ColourValue(1.0,1.0,1.0,1.0),'c') + + c = sceneManager.createEntity("cubo", "cube.mesh") + n = sceneManager.getRootSceneNode().createChildSceneNode() + n.attachObject(c) + n.setPosition(ogre.Vector3(0, 0, 350)) + + c.setMaterialName('Examples/Rockwall') + + mat=ogre.MaterialManager.getSingleton().getByName('Examples/Rockwall') + tex=mat.getTechnique(0).getPass(0).getTextureUnitState(0) + tex.setTextureName("Write Texture") + + +if __name__ == '__main__': + try: + application = TestApplication() + application.go() + except ogre.OgreException, e: + print e This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |