[Python-ogre-commit] SF.net SVN: python-ogre:[684] trunk/python-ogre
Brought to you by:
andy_miller,
roman_yakovenko
From: <and...@us...> - 2008-08-05 03:02:09
|
Revision: 684 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=684&view=rev Author: andy_miller Date: 2008-08-05 03:02:16 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Further Updates for the PCZ Portal SceneManager Support Also changed paths in the CEGUI package to ensure the right dll's are loaded first Modified Paths: -------------- trunk/python-ogre/code_generators/ogrepcz/generate_code.py trunk/python-ogre/code_generators/ogrepcz/hand_made_wrappers.py trunk/python-ogre/code_generators/ogrepcz/python_ogrepcz_sizeof.h trunk/python-ogre/demos/ogrepcz/Demo_PCZ01.py trunk/python-ogre/demos/ogrepcz/RoomObject.py trunk/python-ogre/demos/plugins.cfg trunk/python-ogre/packages_2.5/ogre/gui/CEGUI/__init__.py trunk/python-ogre/packages_2.5/ogre/gui/navi/__init__.py Modified: trunk/python-ogre/code_generators/ogrepcz/generate_code.py =================================================================== --- trunk/python-ogre/code_generators/ogrepcz/generate_code.py 2008-08-02 02:45:14 UTC (rev 683) +++ trunk/python-ogre/code_generators/ogrepcz/generate_code.py 2008-08-05 03:02:16 UTC (rev 684) @@ -63,18 +63,27 @@ excludes=['::Ogre::PCZSceneManagerFactory::initMetaData', '::Ogre::PCZSceneManagerFactory::createInstance', - '::Ogre::PCZSceneManagerFactory::destroyInstance' + '::Ogre::PCZSceneManagerFactory::destroyInstance', + '::Ogre::Portal::setCorners' # hand wrapped.. ] for e in excludes: main_ns.member_functions(e).exclude() - print "Excluded Member Function:", e + print "Excluded Member Function(s):", e excludes=['::Ogre::PCZSceneManagerFactory::FACTORY_TYPE_NAME' ] for e in excludes: main_ns.variable(e).exclude() print "Excluded Variable:", e - + +# std_ns = global_ns.namespace('std') +# for c in std_ns.classes(): +# if 'map' in c.decl_string or 'Ogre' in c.decl_string: +# print c.name, c.decl_string +# std_ns.class_('::std::vector<Ogre::Plane, std::allocator<Ogre::Plane> >') +# # std_ns.class_('::std::map<std::string, std::allocator<std::string> >') + + ############################################################ ## ## And there are things that manually need to be INCLUDED @@ -93,8 +102,29 @@ # '::Ogre::PCZone::NODE_LIST_TYPE' ] for i in includes: - main_ns.enum(i).include() - + main_ns.enum(i).include() + for c in main_ns.classes(): + if "Singleton" in c.decl_string: + print c, c.name, c.decl_string + includes = ['::Ogre::Singleton<Ogre::PCZoneFactoryManager>', + 'Ogre::Singleton<Ogre::PCZoneFactoryManager>', + '::Ogre::Singleton<::Ogre::PCZoneFactoryManager>', + 'Singleton<PCZoneFactoryManager>' + ] + for i in includes: + try: + main_ns.class_(i).include() + print "Forced Include:", i + except: + pass + + main_ns.class_('RaySceneQuery').include(already_exposed=True) + main_ns.class_('DefaultRaySceneQuery').include(already_exposed=True) + main_ns.class_('SceneQuery').include(already_exposed=True) + main_ns.class_('RaySceneQueryListener').include(already_exposed=True) + + + ############################################################ ## ## And things that need manual fixes, but not necessarly hand wrapped @@ -106,26 +136,24 @@ main_ns = global_ns.namespace( MAIN_NAMESPACE ) else: main_ns = global_ns + + includes_already = ['::std::vector<Ogre::PlaneBoundedVolume, std::allocator<Ogre::PlaneBoundedVolume> >', + '::std::vector<Ogre::Plane, std::allocator<Ogre::Plane> >', + '::std::map<std:string' + ] + includes = ['::Ogre::Singleton<Ogre::PCZoneFactoryManager>' + ] for c in global_ns.classes(): - if c.decl_string.startswith("::std::vector<Ogre::PlaneBoundedVolume, std::allocator<Ogre::PlaneBoundedVolume> >"): - print "Excluding:", c - c.include(already_exposed=True) - try: - global_ns.namespace("std").class_('vector<Ogre::PlaneBoundedVolume>, std::allocator<Ogre::BoundedVolume> >').exclude() - print "OK1" - except: - print "FAIL1" - try: - main_ns.class_("std::vector<Ogre::PlaneBoundedVolume, std::allocator<Ogre::PlaneBoundedVolume> >").exclude() - print "OK2" - except: - print "FAIL2" - try: - main_ns.class_("::std::vector<Ogre::PlaneBoundedVolume, std::allocator<Ogre::PlaneBoundedVolume> >").exclude() - print "OK3" - except: - print "FAIL3" + for i in includes_already: + if c.decl_string.startswith(i): + print "Including Special(already Exposed):", c + c.include(already_exposed=True) + for i in includes: + if c.decl_string.startswith(i): + print "Including Special:", c + c.include() + ############################################################ ## ## And things that need to have their argument and call values fixed. @@ -216,30 +244,30 @@ # the 'main'function # def generate_code(): - messages.disable( -# Warnings 1020 - 1031 are all about why Py++ generates wrapper for class X - messages.W1020 - , messages.W1021 - , messages.W1022 - , messages.W1023 - , messages.W1024 - , messages.W1025 - , messages.W1026 - , messages.W1027 - , messages.W1028 - , messages.W1029 - , messages.W1030 - , messages.W1031 - , 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.W1049 # returns reference to local variable - , messages.W1014 # unsupported '=' operator - ) +# messages.disable( +# # Warnings 1020 - 1031 are all about why Py++ generates wrapper for class X +# messages.W1020 +# , messages.W1021 +# , messages.W1022 +# , messages.W1023 +# , messages.W1024 +# , messages.W1025 +# , messages.W1026 +# , messages.W1027 +# , messages.W1028 +# , messages.W1029 +# , messages.W1030 +# , messages.W1031 +# , 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.W1049 # returns reference to local variable +# , messages.W1014 # unsupported '=' operator +# ) # # Use GCCXML to create the controlling XML file. # If the cache file (../cache/*.xml) doesn't exist it gets created, otherwise it just gets loaded @@ -279,22 +307,25 @@ global_ns = mb.global_ns global_ns.exclude() +# # +# # I'm assuming that any 'std' classes etc we need will have already been exposed by the Ogre library +# # +# std_ns = global_ns.namespace('std') +# std_ns.include(already_exposed=True) + # We don't include all of MAIN_NAMESPACE otherwise we get the same full wrapper # so instead we include classes with names that start with PCZ main_ns = global_ns.namespace( MAIN_NAMESPACE ) -# main_ns.include() +# # main_ns.include( already_exposed = True ) ## force the ogre class to be exposed as well... + for c in main_ns.classes(): if c.name.startswith ('PCZ') or c.name.startswith ('PCPlane') or c.name.startswith ('Portal'): c.include() - print "Including ", c + print "Including ", c, c.already_exposed for c in ['Portal','PCPlane']: main_ns.class_(c).include() print "Including ", c -# for e in c.enums(allow_empty=True): -# e.include() -# for v in c.variables(allow_empty=True): -# v.include() common_utils.AutoExclude ( mb, MAIN_NAMESPACE ) ManualExclude ( mb ) Modified: trunk/python-ogre/code_generators/ogrepcz/hand_made_wrappers.py =================================================================== --- trunk/python-ogre/code_generators/ogrepcz/hand_made_wrappers.py 2008-08-02 02:45:14 UTC (rev 683) +++ trunk/python-ogre/code_generators/ogrepcz/hand_made_wrappers.py 2008-08-05 03:02:16 UTC (rev 684) @@ -1,6 +1,13 @@ import os import environment + +# +# these casting calls (in General) shouldn't be needed as by default Python/Boost understands that the objects +# are 'PCZ' ones and it all works.. +# +# However adding casting functions to each class to make them into their Ogre parent types just in case +# WRAPPER_DEFINITION_General = \ """ // The following helper functions are a start and possibly need to be extended to include @@ -21,28 +28,126 @@ PCZSphereSceneQuery : public DefaultSphereSceneQuery PCZPlaneBoundedVolumeListSceneQuery : public DefaultPlaneBoundedVolumeListSceneQuery */ - - """ WRAPPER_REGISTRATION_General = [ - """bp::def( "castAsPCZSceneNode", &General_castAsPCZSceneNode, + """def( "castAsPCZSceneNode", &General_castAsPCZSceneNode, "Python-Ogre Helper Function: Casts a SceneNode as a PCZSceneNode.\\n\\ Input: SceneNode\\n\\ Ouput: PCZSceneNode",\ bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >());""", - """bp::def( "castAsPCZSceneManager", &General_castAsPCZSceneManager, + """def( "castAsPCZSceneManager", &General_castAsPCZSceneManager, "Python-Ogre Helper Function: Casts a SceneManager as a PCZSceneManager.\\n\\ Input: SceneManager\\n\\ Ouput: PCZSceneManager",\ bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >());""", - """bp::def( "castAsPCZRaySceneQuery", &General_castAsPCZRaySceneQuery, + """def( "castAsPCZRaySceneQuery", &General_castAsPCZRaySceneQuery, "Python-Ogre Helper Function: Casts a RaySceneQuery as a PCZRaySceneQuery.\\n\\ Input: RaySceneQuery\\n\\ Ouput: PCZRaySceneQuery",\ bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >());""", ] + +WRAPPER_DEFINITION_PCZSceneNode = \ +""" +Ogre::SceneNode * PCZSceneNode_castAsSceneNode( Ogre::PCZSceneNode * me ){ + return ((Ogre::SceneNode*) me); + } +""" +WRAPPER_REGISTRATION_PCZSceneNode = [ + """def( "castAsSceneNode", &PCZSceneNode_castAsSceneNode, + "Python-Ogre Helper Function: Casts a PCZSceneNode as a SceneNode.\\n\\ + Input: None\\n\\ + Ouput: SceneNode",\ + bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >());""" + ] + + + +WRAPPER_DEFINITION_PCZSceneManager = \ +""" +Ogre::SceneManager * PCZSceneManager_castAsSceneManager( Ogre::PCZSceneManager * me ){ + return ((Ogre::SceneManager*) me); + } +""" +WRAPPER_REGISTRATION_PCZSceneManager = [ + """def( "castAsSceneManager", &PCZSceneManager_castAsSceneManager, + "Python-Ogre Helper Function: Casts a PCZSceneManager as a SceneManager.\\n\\ + Input: None\\n\\ + Ouput: SceneManager",\ + bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >());""" + ] + + +WRAPPER_DEFINITION_PCZRaySceneQuery = \ +""" +Ogre::RaySceneQuery * PCZRaySceneQuery_castAsRaySceneQuery( Ogre::PCZRaySceneQuery * me ){ + return ( ( Ogre::RaySceneQuery* ) me ); + } +Ogre::RaySceneQueryResult& PCZRaySceneQuery_execute( Ogre::PCZRaySceneQuery * me ){ + return ((Ogre::RaySceneQuery*) me)->execute(); + } + +""" +WRAPPER_REGISTRATION_PCZRaySceneQuery = [ + """def( "castAsRaySceneQuery", &PCZRaySceneQuery_castAsRaySceneQuery, + "Python-Ogre Helper Function: Casts a PCZRaySceneQuery as a RaySceneQuery.\\n\\ + Input: None\\n\\ + Ouput: RaySceneQuery",\ + bp::return_value_policy< bp::reference_existing_object, bp::default_call_policies >());""", + """def( "execute", &PCZRaySceneQuery_execute, + "Python-Ogre Helper Function: Executes a query.\\n\\ + Input: None\\n\\ + Ouput: RaySceneQueryResult",\ + bp::return_value_policy< bp::default_call_policies >());""" + ] + + +WRAPPER_DEFINITION_PCZAxisAlignedBoxSceneQuery = \ +""" +Ogre::AxisAlignedBoxSceneQuery * General_castAsAxisAlignedBoxSceneQuery( Ogre::PCZAxisAlignedBoxSceneQuery * me ){ + return (Ogre::AxisAlignedBoxSceneQuery*) me; + } +""" + +WRAPPER_DEFINITION_PCZSphereSceneQuery = \ +""" +Ogre::SphereSceneQuery * General_castAsSphereSceneQuery( Ogre::PCZSphereSceneQuery * me ){ + return (Ogre::SphereSceneQuery*) me; + } +""" + +WRAPPER_DEFINITION_PCZAxisAlignedBoxSceneQuery = \ +""" +Ogre::PlaneBoundedVolumeListSceneQuery * General_castAsPlaneBoundedVolumeListSceneQuery( Ogre::PCZPlaneBoundedVolumeListSceneQuery * me ){ + return (Ogre::PlaneBoundedVolumeListSceneQuery*) me; + } +""" + + + + + +WRAPPER_DEFINITION_Portal = """ +void Portal_setCorners( ::Ogre::Portal & me, boost::python::list listin ) +{ + Ogre::Vector3 corners[4]; + size_t maxlen = len ( listin ); + if (maxlen > 4) maxlen = 4; // can only handle upto 4 'corners' + size_t counter = 0; + for (counter=0;counter < maxlen; counter ++ ) + corners[counter] = boost::python::extract<Ogre::Vector3> (listin[counter]); + me.setCorners ( corners); +} +""" +WRAPPER_REGISTRATION_Portal = [ + """def( "setCorners", &::Portal_setCorners,\\ + "Python-Ogre Helper Function: Sets the corners of a portal.\\n\\ + Input: List of Vector3's - either 2 or 4 depending on portal type\\n\\ + Output: None");""" + ] + ################################################################################################# ################################################################################################# @@ -51,6 +156,20 @@ class_.add_registration_code ( c ) def apply( mb ): + rt = mb.class_( 'Portal' ) + rt.add_declaration_code( WRAPPER_DEFINITION_Portal ) + apply_reg (rt, WRAPPER_REGISTRATION_Portal ) + + rt = mb.class_( 'PCZSceneNode' ) + rt.add_declaration_code( WRAPPER_DEFINITION_PCZSceneNode ) + apply_reg (rt, WRAPPER_REGISTRATION_PCZSceneNode ) + rt = mb.class_( 'PCZSceneManager' ) + rt.add_declaration_code( WRAPPER_DEFINITION_PCZSceneManager ) + apply_reg (rt, WRAPPER_REGISTRATION_PCZSceneManager ) + rt = mb.class_( 'PCZRaySceneQuery' ) + rt.add_declaration_code( WRAPPER_DEFINITION_PCZRaySceneQuery ) + apply_reg (rt, WRAPPER_REGISTRATION_PCZRaySceneQuery ) + mb.add_declaration_code( WRAPPER_DEFINITION_General ) apply_reg (mb, WRAPPER_REGISTRATION_General ) \ No newline at end of file Modified: trunk/python-ogre/code_generators/ogrepcz/python_ogrepcz_sizeof.h =================================================================== --- trunk/python-ogre/code_generators/ogrepcz/python_ogrepcz_sizeof.h 2008-08-02 02:45:14 UTC (rev 683) +++ trunk/python-ogre/code_generators/ogrepcz/python_ogrepcz_sizeof.h 2008-08-05 03:02:16 UTC (rev 684) @@ -1 +1,5 @@ // sizeof ( variable ); +sizeof( PCZCamera ); +sizeof ( ZoneData ); +sizeof ( Ogre::Singleton<Ogre::PCZoneFactoryManager> ); + Modified: trunk/python-ogre/demos/ogrepcz/Demo_PCZ01.py =================================================================== --- trunk/python-ogre/demos/ogrepcz/Demo_PCZ01.py 2008-08-02 02:45:14 UTC (rev 683) +++ trunk/python-ogre/demos/ogrepcz/Demo_PCZ01.py 2008-08-05 03:02:16 UTC (rev 684) @@ -27,22 +27,24 @@ import ogre.io.OIS as ois import ogre.renderer.ogrepcz as pcz -# import RoomObject +import RoomObject Global_buildingNode = None #pcz.PCZSceneNode() -Global_buildingTranslate = None # ogre.Vector3() -Global_raySceneQuery = None # ogre.RaySceneQuery() -Global_targetMO = None #ogre.MovableObject() -class PCZTestFrameListener ( sf.ExampleFrameListener): - def __init__(self, renderWindow, camera ): +class PCZTestFrameListener ( sf.FrameListener): + def __init__(self, renderWindow, sceneManager,camera ): sf.FrameListener.__init__(self, renderWindow, camera) self.moveSpeed = 15.0 - self.raySceneQueue = sceneManager.createRayQuery(ogre.Ray(camera.getPosition(), + self.targetMO =0 + self.buildingTranslate = ogre.Vector3() + + print "\n\n** :", sceneManager + self.raySceneQuery= sceneManager.createRayQuery(ogre.Ray(camera.getPosition(), ogre.Vector3.NEGATIVE_UNIT_Y)) + + print "\n\n** :", sceneManager, "\n", self.raySceneQuery self.camera = camera - self.updateRay=ogre.Ray() self.pczCameraParentNode = pcz.castAsPCZSceneNode(self.camera.getParentSceneNode()) def moveCamera( self ): @@ -53,84 +55,87 @@ self.camera.getParentSceneNode().pitch(self.rotationY) self.camera.getParentSceneNode().yaw(self.rotationX, ogre.Node.TS_WORLD) - Global_buildingNode.translate(Global_buildingTranslate, ogre.Node.TS_LOCAL) + Global_buildingNode.translate(self.buildingTranslate, ogre.Node.TS_LOCAL) def frameRenderingQueued( self, evt ): - if sf.FrameListener.frameRenderingQueued( evt ) == False: + if sf.FrameListener.frameRenderingQueued( self, evt ) == False: return False - Global_buildingTranslate = ogre.Vector3(0,0,0) - if self.keyboard.isKeyDown( ois.KC_LBRACKET ): - Global_buildingTranslate = ogre.Vector3(0,-10,0) - if self.keyboard.isKeyDown( ois.KC_RBRACKET ): - Global_buildingTranslate = ogre.Vector3(0,10,0) - if self.keyboard.isKeyDown( ois.KC_LSHIFT ) or self.keyboard.isKeyDown( ois.KC_RSHIFT ): + self.buildingTranslate = ogre.Vector3(0,0,0) + if self.Keyboard.isKeyDown( ois.KC_LBRACKET ): + self.buildingTranslate = ogre.Vector3(0,-10,0) + if self.Keyboard.isKeyDown( ois.KC_RBRACKET ): + self.buildingTranslate = ogre.Vector3(0,10,0) + if self.Keyboard.isKeyDown( ois.KC_LSHIFT ) or self.Keyboard.isKeyDown( ois.KC_RSHIFT ): self.moveSpeed = 150 - else + else: self.moveSpeed = 15 # test the ray scene query by showing bounding box of whatever the camera is pointing directly at # (takes furthest hit) - self.updateRay.setOrigin(self.camera.getParentSceneNode().getPosition()) - self.updateRay.setDirection(self.camera.getParentSceneNode().getOrientation()*ogre.Vector3.NEGATIVE_UNIT_Z) - Global_raySceneQuery.setRay(updateRay) + updateRay = ogre.Ray() + updateRay.setOrigin(self.camera.getParentSceneNode().getPosition()) + updateRay.setDirection(self.camera.getParentSceneNode().getOrientation()*ogre.Vector3.NEGATIVE_UNIT_Z) + self.raySceneQuery.setRay(updateRay) zone = self.pczCameraParentNode.getHomeZone() - pcz.castAsPCZRaySceneQuery(Global_raySceneQuery).setStartZone(zone) - pcz.castAsPCZRaySceneQuery(Global_raySceneQuery).setExcludeNode(self.camera.getParentSceneNode()) - for queryResult in Global_raySceneQuery.execute(): - ri = qryResult.rbegin() - mo = ri.movable - if Global_targetMO != mo: - if Global_targetMO != 0: - Global_targetMO.getParentSceneNode().showBoundingBox(False) - Global_targetMO = mo - Global_targetMO.getParentSceneNode().showBoundingBox(True) + pcz.castAsPCZRaySceneQuery(self.raySceneQuery).setStartZone(zone) + pcz.castAsPCZRaySceneQuery(self.raySceneQuery).setExcludeNode(self.camera.getParentSceneNode()) + rq = self.raySceneQuery.castAsRaySceneQuery() +# print "RAYQUERY", rq + for queryResult in self.raySceneQuery.execute(): # + mo = queryResult.movable + if self.targetMO != mo: + if self.targetMO != 0: + self.targetMO.getParentSceneNode().showBoundingBox(False) + self.targetMO = mo + self.targetMO.getParentSceneNode().showBoundingBox(True) return True -class TerrainListener(sf.FrameListener): - def __init__(self, renderWindow, camera, sceneManager): - sf.FrameListener.__init__(self, renderWindow, camera) - self.sceneManager = sceneManager - self.moveSpeed = 50.0 - - self.raySceneQuery = sceneManager.createRayQuery(ogre.Ray(camera.getPosition(), - ogre.Vector3.NEGATIVE_UNIT_Y)) - self.camera = camera - #self.camera.setPosition (self.camera.getPosition() + ogre.Vector3(0.0, 10.0, 0.0)) +# class TerrainListener(sf.FrameListener): +# def __init__(self, renderWindow, camera, sceneManager): +# sf.FrameListener.__init__(self, renderWindow, camera) +# self.sceneManager = sceneManager +# self.moveSpeed = 50.0 +# +# self.raySceneQuery = sceneManager.createRayQuery(ogre.Ray(camera.getPosition(), +# ogre.Vector3.NEGATIVE_UNIT_Y)) +# self.camera = camera +# #self.camera.setPosition (self.camera.getPosition() + ogre.Vector3(0.0, 10.0, 0.0)) +# +# def frameStarted(self, frameEvent): +# # clamp to terrain +# updateRay = ogre.Ray() +# updateRay.setOrigin (self.camera.getPosition() + ogre.Vector3(0.0, 10.0, 0.0)) +# updateRay.setDirection (ogre.Vector3.NEGATIVE_UNIT_Y) +# self.raySceneQuery.Ray = 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 + 15.0, pos.z) +# break +# +# return sf.FrameListener.frameStarted(self, frameEvent) - def frameStarted(self, frameEvent): - # clamp to terrain - updateRay = ogre.Ray() - updateRay.setOrigin (self.camera.getPosition() + ogre.Vector3(0.0, 10.0, 0.0)) - updateRay.setDirection (ogre.Vector3.NEGATIVE_UNIT_Y) - self.raySceneQuery.Ray = 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 + 15.0, pos.z) - break - return sf.FrameListener.frameStarted(self, frameEvent) - - class PCZTestApplication (sf.Application): def __del__(self): - del Global_raySceneQuery + del self.raySceneQuery def _chooseSceneManager ( self ): # Create the SceneManager, in this case a generic one self.sceneManager = self.root.createSceneManager("PCZSceneManager", "PCZSceneManager") + print "\n****:", self.sceneManager # initialize the scene manager using terrain as default zone zoneTypeName = "ZoneType_Default" self.pczSM = pcz.castAsPCZSceneManager( self.sceneManager ) # store this for future reference self.pczSM.init(zoneTypeName) #self.sceneManager.showBoundingBoxes(True) -# def _createFrameListener( self ): -# self.frameListener= PCZTestFrameListener(self.renderWindow, self.camera) -# self.root.addFrameListener(self.frameListener) + def _createFrameListener( self ): + self.frameListener= PCZTestFrameListener(self.renderWindow, self.sceneManager,self.camera) + self.root.addFrameListener(self.frameListener) def _createCamera(self): # Create the camera @@ -210,7 +215,7 @@ # Create a skybox self.sceneManager.setSkyBox(True, "Examples/CloudyNoonSkyBox", 500 ) # put the skybox node in the default zone -# self.pczSM.setSkyZone(None) + self.pczSM.setSkyZone(None) # Create a light l = self.sceneManager.createLight("MainLight") @@ -293,31 +298,31 @@ # set far clip plane to one terrain zone width (we have a LOT of terrain here, so we need to do far clipping!) self.camera.setFarClipDistance(1500) -# # create test buildinig -# RoomObject roomObj -# Global_buildingNode = roomObj.createTestBuilding(self.sceneManager, String("1")) -# Global_buildingNode.setPosition(500, 165, 570) -# #ogre.Radian r = Radian(3.1416/7.0) -# #Global_buildingNode.rotate(ogre.Vector3.UNIT_Y, r) -# + # create test buildinig + roomObj = RoomObject.RoomObject() + Global_buildingNode = roomObj.createTestBuilding(self.sceneManager, "1") + Global_buildingNode.setPosition(500, 165, 570) + #ogre.Radian r = Radian(3.1416/7.0) + #Global_buildingNode.rotate(ogre.Vector3.UNIT_Y, r) + # # create another test buildinig -# RoomObject roomObj2 +# roomObj2 = RoomObject.RoomObject() # Global_buildingNode = roomObj2.createTestBuilding(self.sceneManager, String("2")) # Global_buildingNode.setPosition(400, 165, 570) -# #ogre.Radian r = Radian(3.1416/7.0) -# #Global_buildingNode.rotate(ogre.Vector3.UNIT_Y, r) -# -# # Position camera in the center of the building -# self.cameraNode.setPosition(Global_buildingNode.getPosition()) -# # Look back along -Z -# self.camera.lookAt(self.cameraNode._getDerivedPosition() + ogre.Vector3(0,0,-300)) -# # Update bounds for camera -# self.cameraNode._updateBounds() -# + #ogre.Radian r = Radian(3.1416/7.0) + #Global_buildingNode.rotate(ogre.Vector3.UNIT_Y, r) + + # Position camera in the center of the building + self.cameraNode.setPosition(Global_buildingNode.getPosition()) + # Look back along -Z + self.camera.lookAt(self.cameraNode._getDerivedPosition() + ogre.Vector3(0,0,-300)) + # Update bounds for camera + self.cameraNode._updateBounds() + # # create the ray scene query -# Global_raySceneQuery = self.sceneManager.createRayQuery( +# self.raySceneQuery = self.sceneManager.createRayQuery( # Ray(self.camera.getParentNode().getPosition(), ogre.Vector3.NEGATIVE_UNIT_Z)) -# Global_raySceneQuery.setSortByDistance(True, 5) +# self.raySceneQuery.setSortByDistance(True, 5) Modified: trunk/python-ogre/demos/ogrepcz/RoomObject.py =================================================================== --- trunk/python-ogre/demos/ogrepcz/RoomObject.py 2008-08-02 02:45:14 UTC (rev 683) +++ trunk/python-ogre/demos/ogrepcz/RoomObject.py 2008-08-05 03:02:16 UTC (rev 684) @@ -1,1009 +1,684 @@ ## +## Filename : RoomObject.py +## based on C++ demo in Ogre ## -## -## Filename : RoomObject.cpp -# # -# # -# # class RoomObject -# # -# # private: -# # Ogre::Vector3 points[32]; -# # int mPortalCount; -# # public: +import sys +import os +sys.path.insert(0,'..') +import PythonOgreConfig -DOOR_NONE = 0x00 -DOOR_TOP = 0x01 -DOOR_BOT = 0x02 -DOOR_FRONT = 0x04 -DOOR_BACK = 0x08 -DOOR_LEFT = 0x10 -DOOR_RIGHT = 0x20 -DOOR_ALL = 0xFF +## this here becase the Plug_PCZSceneManager.dll needs to be accessed by both the python module and the ogre plugins +if sys.platform == 'win32': + newpath = os.path.join ( os.path.abspath(os.path.dirname(__file__)), '../../plugins') + os.environ['PATH'] = newpath +';' + os.environ['PATH'] -# # -# # -#include "Ogre.h" -#include "OgreMaterial.h" -#include "RoomObject.h" -#include "OgrePortal.h" +import ogre.renderer.OGRE as ogre +import ogre.renderer.ogrepcz as pcz -using namespace Ogre -static int count = 0 +DOOR_NONE = 0x00 +DOOR_TOP = 0x01 +DOOR_BOT = 0x02 +DOOR_FRONT = 0x04 +DOOR_BACK = 0x08 +DOOR_LEFT = 0x10 +DOOR_RIGHT = 0x20 +DOOR_ALL = 0xFF -PCZSceneNode * RoomObject.createTestBuilding(Ogre::SceneManager *scene, String & name) +class RoomObject: + def __init__ ( self ): + self.initMaterial=False + self.count = 0 + self.points =[ogre.Vector3]*32 - count++ - mPortalCount = 0 - Ogre.PCZSceneManager * pczSM = (Ogre::PCZSceneManager*)scene + def createTestBuilding(self, scene,name): + self.count+=1 + pczSM = pcz.castAsPCZSceneManager(scene ) + + ## set points to building exterior size + self.createPoints(ogre.Vector3(60.0, 40.0, 60.0), ogre.Vector3(4.0, 10.0, 4.0)) + + ## create the building exterior + exterior = pczSM.createEntity( name + "_building_exterior", "building_exterior.mesh" ) + + ## make the enclosure a child node of the root scene node + exteriorNode = pcz.castAsPCZSceneNode(scene.getRootSceneNode()).createChildSceneNode(name +"_building_exterior_node", ogre.Vector3( 0, 0, 0 ) ) + exteriorNode.attachObject(exterior) + pczSM.addPCZSceneNode(exteriorNode, pczSM.getDefaultZone()) + + ## create portals for the building exterior + self.createPortals(scene, + exterior, + exteriorNode, + pczSM.getDefaultZone(), + DOOR_FRONT|DOOR_BACK|DOOR_LEFT|DOOR_RIGHT, + True) + + ## reset points to room size + self.createPoints(ogre.Vector3(20.0, 10.0, 20.0), ogre.Vector3(4.0, 10.0, 4.0)) + + ## create an interior room + room = pczSM.createEntity( name +"_room1", "room_nzpz.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room1_node", ogre.Vector3( 0.0, 0.0, 20.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneType = "ZoneType_Default" + zoneName = name +"_room1_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_FRONT|DOOR_BACK, + False) + + ## create another interior room + room = pczSM.createEntity( name +"_room2", "room_nxpxnypynzpz.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room2_node", ogre.Vector3( 0.0, 0.0, 0.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneName = name +"_room2_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_FRONT|DOOR_BACK|DOOR_LEFT|DOOR_RIGHT|DOOR_TOP|DOOR_BOT, + False) + + ## create another interior room + room = pczSM.createEntity( name +"_room3", "room_nzpz.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room3_node", ogre.Vector3( 0.0, 0.0, -20.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneName = name +"_room3_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_FRONT|DOOR_BACK, + False) + + ## create another interior room + room = pczSM.createEntity( name +"_room4", "room_nxpx.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room4_node", ogre.Vector3( -20.0, 0.0, 0.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneName = name +"_room4_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_LEFT|DOOR_RIGHT, + False) + + ## create another interior room + room = pczSM.createEntity( name +"_room5", "room_nxpx.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room5_node", ogre.Vector3( 20.0, 0.0, 0.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneName = name +"_room5_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_LEFT|DOOR_RIGHT, + False) + + ## create another interior room + room = pczSM.createEntity( name +"_room6", "room_ny.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room6_node", ogre.Vector3( 0.0, 10.0, 0.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneName = name +"_room6_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_BOT, + False) + + ## create another interior room + room = pczSM.createEntity( name +"_room7", "room_py.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room7_node", ogre.Vector3( 0.0, -50.0, 0.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneName = name +"_room7_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_TOP, + False) + + ## reset points to tall room size + self.createPoints(ogre.Vector3(20.0, 40.0, 20.0), ogre.Vector3(4.0, 10.0, 4.0)) + + ## create another interior room + room = pczSM.createEntity( name +"_room8", "room_nypy_4y.mesh" ) + + ## add the room as a child node to the enclosure node + roomNode = pcz.castAsPCZSceneNode(exteriorNode).createChildSceneNode( name +"_room8_node", ogre.Vector3( 0.0, -25.0, 0.0 ) ) + roomNode.attachObject(room) + + ## room needs it's own zone + zoneName = name +"_room8_zone" + newZone = pczSM.createZone(zoneType, zoneName) + newZone.setEnclosureNode(roomNode) + pczSM.addPCZSceneNode(roomNode, newZone) + + ## create portals for the room + self.createPortals(scene, + room, + roomNode, + newZone, + DOOR_BOT|DOOR_TOP, + False) + + + ## resolve portal zone pointers + pczSM.connectPortalsToTargetZonesByLocation() + + return exteriorNode - ## set points to building exterior size - createPoints(Vector3(60.0, 40.0, 60.0), Vector3(4.0, 10.0, 4.0)) - ## create the building exterior - Entity *exterior = pczSM->createEntity( name + "_building_exterior", "building_exterior.mesh" ) - ## make the enclosure a child node of the root scene node - PCZSceneNode * exteriorNode - exteriorNode = (PCZSceneNode*)scene->getRootSceneNode()->createChildSceneNode(name +"_building_exterior_node", Vector3( 0.0, 0.0f, 0.0f ) ) - exteriorNode->attachObject(exterior) - pczSM->addPCZSceneNode(exteriorNode, pczSM->getDefaultZone()) + def createRoom(self, scene, name, doorFlags, isEnclosure, dimensions, doorDimensions): + self.addMaterial(name, ogre.ColourValue(1,1,1,.75), Ogre.SBT_TRANSPARENT_ALPHA) + room = scene.createManualObject(name) + room.begin(name, ogre.RenderOperation.OT_TRIANGLE_LIST) + + ## create points + self.createPoints(dimensions, doorDimensions) + + fade=0.5 + solid=0.8 + color = ogre.ColourValue(0, 0, solid, solid) + + ## copy to room + for i in range(32): + room.position(self.self.points[i]) + room.colour(color) + + self.createWalls(room, doorFlags, isEnclosure) + room.end() + return room - ## create portals for the building exterior - createPortals(scene, - exterior, - exteriorNode, - pczSM->getDefaultZone(), - DOOR_FRONT|DOOR_BACK|DOOR_LEFT|DOOR_RIGHT, - True) - ## reset points to room size - createPoints(Vector3(20.0, 10.0, 20.0), Vector3(4.0, 10.0, 4.0)) + def addMaterial( self, mat, clr, sbt): + if(self.initMaterial): + return + else: + self.initMaterial=True + + matptr = ogre.MaterialManager.getSingleton().create(mat, "General") + matptr.setReceiveShadows(False) + matptr.getTechnique(0).setLightingEnabled(True) + matptr.getTechnique(0).getPass(0).setDiffuse(clr) + matptr.getTechnique(0).getPass(0).setAmbient(clr) + matptr.getTechnique(0).getPass(0).setSelfIllumination(clr) + matptr.getTechnique(0).getPass(0).setSceneBlending(sbt) + matptr.getTechnique(0).getPass(0).setLightingEnabled(False) + matptr.getTechnique(0).getPass(0).setVertexColourTracking(Ogre.TVC_DIFFUSE) - ## create an interior room - Entity *room = pczSM->createEntity( name +"_room1", "room_nzpz.mesh" ) - ## add the room as a child node to the enclosure node - PCZSceneNode * roomNode - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room1_node", Vector3( 0.0, 0.0f, 20.0f ) ) - roomNode->attachObject(room) + def createPoints(self, dimensions, doorDimensions): - ## room needs it's own zone - Ogre.String zoneType = "ZoneType_Default" - Ogre.String zoneName = name +"_room1_zone" - PCZone * newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) + l = dimensions.x/2 + h = dimensions.y/2 + w = dimensions.z/2 + + ## 4 7 + ## *-------* + ## /| /| + ## / | / | y + ## / 5| 3/ 6| | + ## 0*---*---*---* *-- x + ## | / | / / + ## | / | / z + ## |/ |/ + ## 1*-------*2 + + self.points[0] = ogre.Vector3(-l, h, w) ##0 + self.points[1] = ogre.Vector3(-l, -h, w) ##1 + self.points[2] = ogre.Vector3(l, -h, w) ##2 + self.points[3] = ogre.Vector3(l, h, w) ##3 + + self.points[4] = ogre.Vector3(-l, h, -w) ##4 + self.points[5] = ogre.Vector3(-l, -h, -w) ##5 + self.points[6] = ogre.Vector3(l, -h, -w) ##6 + self.points[7] = ogre.Vector3(l, h, -w) ##7 + + ## doors + l2 = doorDimensions.x/2 + h2 = doorDimensions.y/2 + w2 = doorDimensions.z/2 + + ## front door + self.points[8] = ogre.Vector3(-l2, h2, w) ##8 + self.points[9] = ogre.Vector3(-l2, -h2, w) ##9 + self.points[10] = ogre.Vector3(l2, -h2, w) ##10 + self.points[11] = ogre.Vector3(l2, h2, w) ##11 + + ## back door + self.points[12] = ogre.Vector3(-l2, h2, -w) ##12 + self.points[13] = ogre.Vector3(-l2, -h2, -w) ##13 + self.points[14] = ogre.Vector3(l2, -h2, -w) ##14 + self.points[15] = ogre.Vector3(l2, h2, -w) ##15 + + ## top door + self.points[16] = ogre.Vector3(-l2, h, -w2) ##16 + self.points[17] = ogre.Vector3(-l2, h, w2) ##17 + self.points[18] = ogre.Vector3(l2, h, w2) ##18 + self.points[19] = ogre.Vector3(l2, h, -w2) ##19 + + ## bottom door + self.points[20] = ogre.Vector3(-l2, -h, -w2) ##20 + self.points[21] = ogre.Vector3(-l2, -h, w2) ##21 + self.points[22] = ogre.Vector3(l2, -h, w2) ##22 + self.points[23] = ogre.Vector3(l2, -h, -w2) ##23 + + ## left door + self.points[24] = ogre.Vector3(-l, h2, w2) ##24 + self.points[25] = ogre.Vector3(-l, -h2, w2) ##25 + self.points[26] = ogre.Vector3(-l, -h2, -w2) ##26 + self.points[27] = ogre.Vector3(-l, h2, -w2) ##27 + + ## right door + self.points[28] = ogre.Vector3(l, h2, w2) ##28 + self.points[29] = ogre.Vector3(l, -h2, w2) ##29 + self.points[30] = ogre.Vector3(l, -h2, -w2) ##30 + self.points[31] = ogre.Vector3(l, h2, -w2) ##31 - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_FRONT|DOOR_BACK, - False) - ## create another interior room - room = pczSM->createEntity( name +"_room2", "room_nxpxnypynzpz.mesh" ) + def createWalls(self, room, doorFlags, isEnclosure): + if (isEnclosure): + if(doorFlags & DOOR_FRONT): + ## make front wall outward facing with door + room.quad(0, 8, 11, 3) + room.quad(1, 9, 8, 0) + room.quad(2, 10, 9, 1) + room.quad(3, 11, 10, 2) + else: + ## make front wall outward facing without door + room.quad(0, 1, 2, 3) + + if(doorFlags & DOOR_BACK): + ## make back wall outward facing with door + room.quad(7, 15, 12, 4) + room.quad(6, 14, 15, 7) + room.quad(5, 13, 14, 6) + room.quad(4, 12, 13, 5) + else: + ## make back wall outward facing without door + room.quad(7, 6, 5, 4) + + if(doorFlags & DOOR_TOP): + ## make top wall outward facing with door + room.quad(0, 17, 16, 4) + room.quad(4, 16, 19, 7) + room.quad(7, 19, 18, 3) + room.quad(3, 18, 17, 0) + else: + ## make top wall outward facing without door + room.quad(0, 3, 7, 4) + + if(doorFlags & DOOR_BOT): + ## make bottom wall outward facing with door + room.quad(5, 20, 21, 1) + room.quad(6, 23, 20, 5) + room.quad(2, 22, 23, 6) + room.quad(1, 21, 22, 2) + else: + ## make bottom wall outward facing without door + room.quad(2, 1, 5, 6) + + if(doorFlags & DOOR_LEFT): + ## make left wall outward facing with door + room.quad(0, 24, 25, 1) + room.quad(4, 27, 24, 0) + room.quad(5, 26, 27, 4) + room.quad(1, 25, 26, 5) + else: + ## make left side wall outward facing without door + room.quad(1, 0, 4, 5) + + if(doorFlags & DOOR_RIGHT): + ## make right wall outward facing with door + room.quad(2, 29, 28, 3) + room.quad(6, 30, 29, 2) + room.quad(7, 31, 30, 6) + room.quad(3, 28, 31, 7) + else: + ## make right side wall outward facing without door + room.quad(3, 2, 6, 7) + + else: + + ## front back + if(doorFlags & DOOR_FRONT): + ## make front wall inward facing with door + room.quad(3, 11, 8, 0) + room.quad(0, 8, 9, 1) + room.quad(1, 9, 10, 2) + room.quad(2, 10, 11, 3) + else: + ## make front wall inward facing without door + room.quad(3, 2, 1, 0) + + if(doorFlags & DOOR_BACK): + ## make back wall inward facing with door + room.quad(4, 12, 15, 7) + room.quad(7, 15, 14, 6) + room.quad(6, 14, 13, 5) + room.quad(5, 13, 12, 4) + else: + ## make back wall inward facing without door + room.quad(4, 5, 6, 7) + + ## top bottom + if(doorFlags & DOOR_TOP): + ## make top wall inward facing with door + room.quad(4, 16, 17, 0) + room.quad(7, 19, 16, 4) + room.quad(3, 18, 19, 7) + room.quad(0, 17, 18, 3) + else: + ## make top wall inward facing without door + room.quad(4, 7, 3, 0) + + if(doorFlags & DOOR_BOT): + ## make bottom wall inward facing with door + room.quad(1, 21, 20, 5) + room.quad(5, 20, 23, 6) + room.quad(6, 23, 22, 2) + room.quad(2, 22, 21, 1) + else: + ## make bottom wall inward facing without door + room.quad(6, 5, 1, 2) + + ## end caps + if(doorFlags & DOOR_LEFT): + ## make left wall inward facing with door + room.quad(1, 25, 24, 0) + room.quad(0, 24, 27, 4) + room.quad(4, 27, 26, 5) + room.quad(5, 26, 25, 1) + else: + ## make left side wall inward facing without door + room.quad(5, 4, 0, 1) + + if(doorFlags & DOOR_RIGHT): + ## make right wall inward facing with door + room.quad(3, 28, 29, 2) + room.quad(2, 29, 30, 6) + room.quad(6, 30, 31, 7) + room.quad(7, 31, 28, 3) + else: + ## make right side wall inward facing without door + room.quad(7, 6, 2, 3) - ## add the room as a child node to the enclosure node - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room2_node", Vector3( 0.0, 0.0f, 0.0f ) ) - roomNode->attachObject(room) - - ## room needs it's own zone - zoneName = name +"_room2_zone" - newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) - - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_FRONT|DOOR_BACK|DOOR_LEFT|DOOR_RIGHT|DOOR_TOP|DOOR_BOT, - False) - - ## create another interior room - room = pczSM->createEntity( name +"_room3", "room_nzpz.mesh" ) - - ## add the room as a child node to the enclosure node - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room3_node", Vector3( 0.0, 0.0f, -20.0f ) ) - roomNode->attachObject(room) - - ## room needs it's own zone - zoneName = name +"_room3_zone" - newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) - - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_FRONT|DOOR_BACK, - False) - - ## create another interior room - room = pczSM->createEntity( name +"_room4", "room_nxpx.mesh" ) - - ## add the room as a child node to the enclosure node - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room4_node", Vector3( -20.0, 0.0f, 0.0f ) ) - roomNode->attachObject(room) - - ## room needs it's own zone - zoneName = name +"_room4_zone" - newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) - - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_LEFT|DOOR_RIGHT, - False) - - ## create another interior room - room = pczSM->createEntity( name +"_room5", "room_nxpx.mesh" ) - - ## add the room as a child node to the enclosure node - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room5_node", Vector3( 20.0, 0.0f, 0.0f ) ) - roomNode->attachObject(room) - - ## room needs it's own zone - zoneName = name +"_room5_zone" - newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) - - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_LEFT|DOOR_RIGHT, - False) - - ## create another interior room - room = pczSM->createEntity( name +"_room6", "room_ny.mesh" ) - - ## add the room as a child node to the enclosure node - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room6_node", Vector3( 0.0, 10.0f, 0.0f ) ) - roomNode->attachObject(room) - - ## room needs it's own zone - zoneName = name +"_room6_zone" - newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) - - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_BOT, - False) - - ## create another interior room - room = pczSM->createEntity( name +"_room7", "room_py.mesh" ) - - ## add the room as a child node to the enclosure node - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room7_node", Vector3( 0.0, -50.0f, 0.0f ) ) - roomNode->attachObject(room) - - ## room needs it's own zone - zoneName = name +"_room7_zone" - newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) - - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_TOP, - False) - - ## reset points to tall room size - createPoints(Vector3(20.0, 40.0, 20.0), Vector3(4.0, 10.0, 4.0)) - - ## create another interior room - room = pczSM->createEntity( name +"_room8", "room_nypy_4y.mesh" ) - - ## add the room as a child node to the enclosure node - roomNode = (PCZSceneNode*)exteriorNode->createChildSceneNode( name +"_room8_node", Vector3( 0.0, -25.0f, 0.0f ) ) - roomNode->attachObject(room) - - ## room needs it's own zone - zoneName = name +"_room8_zone" - newZone = pczSM->createZone(zoneType, zoneName) - newZone->setEnclosureNode(roomNode) - pczSM->addPCZSceneNode(roomNode, newZone) - - ## create portals for the room - createPortals(scene, - room, - roomNode, - newZone, - DOOR_BOT|DOOR_TOP, - False) - - - ## resolve portal zone pointers - pczSM->connectPortalsToTargetZonesByLocation() - - return exteriorNode - - - -Ogre.ManualObject* RoomObject::createRoom(Ogre::SceneManager *scene, - Ogre.String &name, - short doorFlags, - bool isEnclosure, - Ogre.Vector3 dimensions, - Ogre.Vector3 doorDimensions) - - addMaterial(name, Ogre.ColourValue(1,1,1,.75), Ogre::SBT_TRANSPARENT_ALPHA) - - Ogre.ManualObject* room = scene->createManualObject(name) - - room->begin(name, Ogre.RenderOperation::OT_TRIANGLE_LIST) - - ## create points - createPoints(dimensions, doorDimensions) - - Ogre.Real fade=.5 - Ogre.Real solid=.8 - Ogre.ColourValue color = ColourValue(0, 0, solid, solid) - - ## copy to room - for (int i=0 i<32;i++) - - room->position(points[i]) - room->colour(color) - - - createWalls(room, doorFlags, isEnclosure) - - room->end() - - return room - - -void RoomObject.addMaterial( Ogre::String &mat, - Ogre.ColourValue &clr, - Ogre.SceneBlendType sbt) - - static int init=False - if(init): - return - else: - init=True - - Ogre.MaterialPtr matptr = Ogre::MaterialManager::getSingleton().create(mat, "General") - matptr->setReceiveShadows(False) - matptr->getTechnique(0)->setLightingEnabled(True) - matptr->getTechnique(0)->getPass(0)->setDiffuse(clr) - matptr->getTechnique(0)->getPass(0)->setAmbient(clr) - matptr->getTechnique(0)->getPass(0)->setSelfIllumination(clr) - matptr->getTechnique(0)->getPass(0)->setSceneBlending(sbt) - matptr->getTechnique(0)->getPass(0)->setLightingEnabled(False) - matptr->getTechnique(0)->getPass(0)->setVertexColourTracking(Ogre.TVC_DIFFUSE) - - -void RoomObject.createPoints(Ogre::Vector3 dimensions, - Ogre.Vector3 doorDimensions) - - Ogre.Real l = dimensions.x/2 - Ogre.Real h = dimensions.y/2 - Ogre.Real w = dimensions.z/2 - -## 4 7 -## *-------* -## /| /| -## / | / | y -## / 5| 3/ 6| | -## 0*---*---*---* *-- x -## | / | / / -## | / | / z -## |/ |/ -## 1*-------*2 - - points[0] = Ogre.Vector3(-l, h, w) ##0 - points[1] = Ogre.Vector3(-l, -h, w) ##1 - points[2] = Ogre.Vector3(l, -h, w) ##2 - points[3] = Ogre.Vector3(l, h, w) ##3 - - points[4] = Ogre.Vector3(-l, h, -w) ##4 - points[5] = Ogre.Vector3(-l, -h, -w) ##5 - points[6] = Ogre.Vector3(l, -h, -w) ##6 - points[7] = Ogre.Vector3(l, h, -w) ##7 - - ## doors - Ogre.Real l2 = doorDimensions.x/2 - Ogre.Real h2 = doorDimensions.y/2 - Ogre.Real w2 = doorDimensions.z/2 - - ## front door - points[8] = Ogre.Vector3(-l2, h2, w) ##8 - points[9] = Ogre.Vector3(-l2, -h2, w) ##9 - points[10] = Ogre.Vector3(l2, -h2, w) ##10 - points[11] = Ogre.Vector3(l2, h2, w) ##11 - - ## back door - points[12] = Ogre.Vector3(-l2, h2, -w) ##12 - points[13] = Ogre.Vector3(-l2, -h2, -w) ##13 - points[14] = Ogre.Vector3(l2, -h2, -w) ##14 - points[15] = Ogre.Vector3(l2, h2, -w) ##15 - - ## top door - points[16] = Ogre.Vector3(-l2, h, -w2) ##16 - points[17] = Ogre.Vector3(-l2, h, w2) ##17 - points[18] = Ogre.Vector3(l2, h, w2) ##18 - points[19] = Ogre.Vector3(l2, h, -w2) ##19 - - ## bottom door - points[20] = Ogre.Vector3(-l2, -h, -w2) ##20 - points[21] = Ogre.Vector3(-l2, -h, w2) ##21 - points[22] = Ogre.Vector3(l2, -h, w2) ##22 - points[23] = Ogre.Vector3(l2, -h, -w2) ##23 - - ## left door - points[24] = Ogre.Vector3(-l, h2, w2) ##24 - points[25] = Ogre.Vector3(-l, -h2, w2) ##25 - points[26] = Ogre.Vector3(-l, -h2, -w2) ##26 - points[27] = Ogre.Vector3(-l, h2, -w2) ##27 - - ## right door - points[28] = Ogre.Vector3(l, h2, w2) ##28 - points[29] = Ogre.Vector3(l, -h2, w2) ##29 - points[30] = Ogre.Vector3(l, -h2, -w2) ##30 - points[31] = Ogre.Vector3(l, h2, -w2) ##31 - - -void RoomObject.createWalls(Ogre::ManualObject* room, - short doorFlags, - bool isEnclosure) - - - if (isEnclosure): - - if(doorFlags & DOOR_FRONT): - - ## make front wall outward facing with door - room->quad(0, 8, 11, 3) - room->quad(1, 9, 8, 0) - room->quad(2, 10, 9, 1) - room->quad(3, 11, 10, 2) - - else: - - ## make front wall outward facing without door - room->quad(0, 1, 2, 3) - - if(doorFlags & DOOR_BACK): - - ## make back wall outward facing with door - room->quad(7, 15, 12, 4) - room->quad(6, 14, 15, 7) - room->quad(5, 13, 14, 6) - room->quad(4, 12, 13, 5) - - else: - - ## make back wall outward facing without door - room->quad(7, 6, 5, 4) - - if(doorFlags & DOOR_TOP): - - ## make top wall outward facing with door - room->quad(0, 17, 16, 4) - room->quad(4, 16, 19, 7) - room->quad(7, 19, 18, 3) - room->quad(3, 18, 17, 0) - - else: - - ## make top wall outward facing without door - room->quad(0, 3, 7, 4) - - if(doorFlags & DOOR_BOT): - - ## make bottom wall outward facing with door - room->quad(5, 20, 21, 1) - room->quad(6, 23, 20, 5) - room->quad(2, 22, 23, 6) - room->quad(1, 21, 22, 2) - - else: - - ## make bottom wall outward facing without door - room->quad(2, 1, 5, 6) - - if(doorFlags & DOOR_LEFT): - - ## make left wall outward facing with door - room->quad(0, 24, 25, 1) - room->quad(4, 27, 24, 0) - room->quad(5, 26, 27, 4) - room->quad(1, 25, 26, 5) - - else: - - ## make left side wall outward facing without door - room->quad(1, 0, 4, 5) - - if(doorFlags & DOOR_RIGHT): - - ## make right wall outward facing with door - room->quad(2, 29, 28, 3) - room->quad(6, 30, 29, 2) - room->quad(7, 31, 30, 6) - room->quad(3, 28, 31, 7) - - else: - - ## make right side wall outward facing without door - room->quad(3, 2, 6, 7) - - - else: - - ## front back - if(doorFlags & DOOR_FRONT): - - ## make front wall inward facing with door - room->quad(3, 11, 8, 0) - room->quad(0, 8, 9, 1) - room->quad(1, 9, 10, 2) - room->quad(2, 10, 11, 3) - - else: - - ## make front wall inward facing without door - room->quad(3, 2, 1, 0) - - if(doorFlags & DOOR_BACK): - - ## make back wall inward facing with door - room->quad(4, 12, 15, 7) - room->quad(7, 15, 14, 6) - room->quad(6, 14, 13, 5) - room->quad(5, 13, 12, 4) - - else: - - ## make back wall inward facing without door - room->quad(4, 5, 6, 7) - - ## top bottom - if(doorFlags & DOOR_TOP): - - ## make top wall inward facing with door - room->quad(4, 16, 17, 0) - room->quad(7, 19, 16, 4) - room->quad(3, 18, 19, 7) - room->quad(0, 17, 18, 3) - - else: - - ## make top wall inward facing without door - room->quad(4, 7, 3, 0) - - if(doorFlags & DOOR_BOT): - - ## make bottom wall inward facing with door - room->quad(1, 21, 20, 5) - room->quad(5, 20, 23, 6) - room->quad(6, 23, 22, 2) - room->quad(2, 22, 21, 1) - - else: - - ## make bottom wall inward facing without door - room->quad(6, 5, 1, 2) - - ## end caps - if(doorFlags & DOOR_LEFT): - - ## make left wall inward facing with door - room->quad(1, 25, 24, 0) - room->quad(0, 24, 27, 4) - room->quad(4, 27, 26, 5) - room->quad(5, 26, 25, 1) - - else: - - ## make left side wall inward facing without door - room->quad(5, 4, 0, 1) - - if(doorFlags & DOOR_RIGHT): - - ## make right wall inward facing with door - room->quad(3, 28, 29, 2) - room->quad(2, 29, 30, 6) - room->quad(6, 30, 31, 7) - room->quad(7, 31, 28, 3) - - else: - - ## make right sid... [truncated message content] |