Revision: 453
http://python-ogre.svn.sourceforge.net/python-ogre/?rev=453&view=rev
Author: andy_miller
Date: 2007-10-22 17:32:24 -0700 (Mon, 22 Oct 2007)
Log Message:
-----------
Added Ben's forest demo to demo/showcase_01
Modified Paths:
--------------
trunk/python-ogre/PythonOgreConfig_nt.py
Added Paths:
-----------
trunk/python-ogre/demos/showcase_01/
trunk/python-ogre/demos/showcase_01/Demo_Forest.py
trunk/python-ogre/demos/showcase_01/Demo_Forest.py.bak
trunk/python-ogre/demos/showcase_01/Ogre.log
trunk/python-ogre/demos/showcase_01/SampleFramework.py
trunk/python-ogre/demos/showcase_01/media/
trunk/python-ogre/demos/showcase_01/media/Triplanar/
trunk/python-ogre/demos/showcase_01/media/Triplanar/New Text Document.txt
trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg
trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.bak
trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.old
trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material
trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material.bak
trunk/python-ogre/demos/showcase_01/media/Triplanar/TerrainShadows.cg
trunk/python-ogre/demos/showcase_01/media/Triplanar/TerrainShadows.cg.bak
trunk/python-ogre/demos/showcase_01/media/Triplanar/Thumbs.db
trunk/python-ogre/demos/showcase_01/media/Triplanar/fp0.frag
trunk/python-ogre/demos/showcase_01/media/Triplanar/grass_1024.jpg
trunk/python-ogre/demos/showcase_01/media/Triplanar/normal_terrain.png
trunk/python-ogre/demos/showcase_01/media/Triplanar/overhang.cg
trunk/python-ogre/demos/showcase_01/media/Triplanar/project.gdp
trunk/python-ogre/demos/showcase_01/media/Triplanar/reliefmap.cg
trunk/python-ogre/demos/showcase_01/media/Triplanar/tangent_map.py
trunk/python-ogre/demos/showcase_01/media/Triplanar/tangent_map.py.bak
trunk/python-ogre/demos/showcase_01/media/Triplanar/tangentmap.png
trunk/python-ogre/demos/showcase_01/media/Triplanar/terr_rock6.jpg
trunk/python-ogre/demos/showcase_01/media/Triplanar/terrain.cfg
trunk/python-ogre/demos/showcase_01/media/Triplanar/terrain.png
trunk/python-ogre/demos/showcase_01/media/Triplanar/terrain_dds.png
trunk/python-ogre/demos/showcase_01/media/Triplanar/terrain_detail.jpg
trunk/python-ogre/demos/showcase_01/media/Triplanar/terrain_texture.jpg
trunk/python-ogre/demos/showcase_01/media/Triplanar/vp0.vert
trunk/python-ogre/demos/showcase_01/media/grass/
trunk/python-ogre/demos/showcase_01/media/grass/BdBush.material
trunk/python-ogre/demos/showcase_01/media/grass/BigDarkBush.mesh
trunk/python-ogre/demos/showcase_01/media/grass/ShortGrass.mesh
trunk/python-ogre/demos/showcase_01/media/grass/Thumbs.db
trunk/python-ogre/demos/showcase_01/media/grass/bush3_IMG_1409.png
trunk/python-ogre/demos/showcase_01/media/grass/bush3_IMG_1409.tga.bmp
trunk/python-ogre/demos/showcase_01/media/grass/fgrass1_v2_256.png
trunk/python-ogre/demos/showcase_01/media/grass/grass.material
trunk/python-ogre/demos/showcase_01/media/grass/grass.png
trunk/python-ogre/demos/showcase_01/media/grass/grass1.material
trunk/python-ogre/demos/showcase_01/media/grass/grass1_SKIN#02.bmp
trunk/python-ogre/demos/showcase_01/media/grass/grass2.png
trunk/python-ogre/demos/showcase_01/media/grass/grass2_grass2.BMP.bmp
trunk/python-ogre/demos/showcase_01/media/grass/grass3_SKIN#22.bmp
trunk/python-ogre/demos/showcase_01/media/grass/grass4_SKIN#32.bmp
trunk/python-ogre/demos/showcase_01/media/grass/grass5_SKIN#33.bmp
trunk/python-ogre/demos/showcase_01/media/grass/grass6_SKIN#41.bmp
trunk/python-ogre/demos/showcase_01/media/grass/meshmagick.log
trunk/python-ogre/demos/showcase_01/media/grass/shortgrass.material
trunk/python-ogre/demos/showcase_01/media/grass/tall_grass.png
trunk/python-ogre/demos/showcase_01/media/terrains/
trunk/python-ogre/demos/showcase_01/media/terrains/Thumbs.db
trunk/python-ogre/demos/showcase_01/media/terrains/densitymap.png
trunk/python-ogre/demos/showcase_01/media/terrains/terrain.cfg
trunk/python-ogre/demos/showcase_01/media/terrains/terrain.png
trunk/python-ogre/demos/showcase_01/media/terrains/terrain_detail.jpg
trunk/python-ogre/demos/showcase_01/media/terrains/terrain_texture_greeb.jpg
trunk/python-ogre/demos/showcase_01/media/trees/
trunk/python-ogre/demos/showcase_01/media/trees/BendyPalm.mesh
trunk/python-ogre/demos/showcase_01/media/trees/KinkyPalm.mesh
trunk/python-ogre/demos/showcase_01/media/trees/LEAFS.JPG
trunk/python-ogre/demos/showcase_01/media/trees/LEAFS.png
trunk/python-ogre/demos/showcase_01/media/trees/Leaves.png
trunk/python-ogre/demos/showcase_01/media/trees/OgreXMLConverter.log
trunk/python-ogre/demos/showcase_01/media/trees/PLANTS09.JPG
trunk/python-ogre/demos/showcase_01/media/trees/Pine1.mesh
trunk/python-ogre/demos/showcase_01/media/trees/PineLeaves.png
trunk/python-ogre/demos/showcase_01/media/trees/StraightPalm.mesh
trunk/python-ogre/demos/showcase_01/media/trees/TREE00.JPG
trunk/python-ogre/demos/showcase_01/media/trees/Thumbs.db
trunk/python-ogre/demos/showcase_01/media/trees/beech.material
trunk/python-ogre/demos/showcase_01/media/trees/beech_tree.mesh
trunk/python-ogre/demos/showcase_01/media/trees/benTree.mesh
trunk/python-ogre/demos/showcase_01/media/trees/birch.material
trunk/python-ogre/demos/showcase_01/media/trees/birch.mesh
trunk/python-ogre/demos/showcase_01/media/trees/blenTree.material
trunk/python-ogre/demos/showcase_01/media/trees/blue_shroom.jpg
trunk/python-ogre/demos/showcase_01/media/trees/blue_shroom.jpg.tga
trunk/python-ogre/demos/showcase_01/media/trees/blue_shroom.mesh
trunk/python-ogre/demos/showcase_01/media/trees/branches.png
trunk/python-ogre/demos/showcase_01/media/trees/meshmagick.log
trunk/python-ogre/demos/showcase_01/media/trees/mrbenTree.blend
trunk/python-ogre/demos/showcase_01/media/trees/mrbenTree.blend1
trunk/python-ogre/demos/showcase_01/media/trees/palms.material
trunk/python-ogre/demos/showcase_01/media/trees/palmtree_palmtexture_2.t.bmp
trunk/python-ogre/demos/showcase_01/media/trees/shrooms.blend
trunk/python-ogre/demos/showcase_01/media/trees/shrooms.blend1
trunk/python-ogre/demos/showcase_01/media/trees/spotted_shroom.material
trunk/python-ogre/demos/showcase_01/media/trees/spotty_shroom.jpg
trunk/python-ogre/demos/showcase_01/media/trees/spotty_shroom.mesh
trunk/python-ogre/demos/showcase_01/media/trees/tipi.blend
trunk/python-ogre/demos/showcase_01/media/trees/tipi.jpg
trunk/python-ogre/demos/showcase_01/media/trees/tipi.material
trunk/python-ogre/demos/showcase_01/media/trees/tipi.mesh
trunk/python-ogre/demos/showcase_01/media/trees/tree.blend
trunk/python-ogre/demos/showcase_01/media/trees/tree.blend1
trunk/python-ogre/demos/showcase_01/media/trees/tree.material
trunk/python-ogre/demos/showcase_01/media/trees/tree.mesh
trunk/python-ogre/demos/showcase_01/media/trees/tree2.mesh
trunk/python-ogre/demos/showcase_01/media/trees/tree_01 - Default.mesh
trunk/python-ogre/demos/showcase_01/media/trees/tree_bush.png
trunk/python-ogre/demos/showcase_01/media/trees/wood7.jpg
trunk/python-ogre/demos/showcase_01/ogre.cfg
trunk/python-ogre/demos/showcase_01/plugins.cfg
trunk/python-ogre/demos/showcase_01/resources.cfg
trunk/python-ogre/demos/showcase_01/triplanar_terrain.cfg
trunk/python-ogre/plugins/
Modified: trunk/python-ogre/PythonOgreConfig_nt.py
===================================================================
--- trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-22 10:13:50 UTC (rev 452)
+++ trunk/python-ogre/PythonOgreConfig_nt.py 2007-10-23 00:32:24 UTC (rev 453)
@@ -26,7 +26,7 @@
PATH_OIS = os.path.join(BASE_DIR, 'ois-1.0RC1')
PATH_Newton = os.path.join(BASE_DIR, 'newtonsdk','sdk')
PATH_FMOD = os.path.join(BASE_DIR, 'fmod')
-PATH_ODE = os.path.join(BASE_DIR, 'ode-0.8')
+PATH_ODE = os.path.join(BASE_DIR, 'ode-0.9')
PATH_OGG = os.path.join(BASE_DIR, 'ogg')
PATH_VORBIS= os.path.join(BASE_DIR, 'vorbis')
PATH_OPENAL= os.path.join(BASE_DIR, 'openal')
Added: trunk/python-ogre/demos/showcase_01/Demo_Forest.py
===================================================================
--- trunk/python-ogre/demos/showcase_01/Demo_Forest.py (rev 0)
+++ trunk/python-ogre/demos/showcase_01/Demo_Forest.py 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,330 @@
+
+
+
+
+import warnings
+warnings.simplefilter('ignore', RuntimeWarning)
+import ogre.renderer.OGRE as ogre
+import ogre.addons.ogreforests as forests
+import SampleFramework as sf
+import math, random
+warnings.simplefilter('default', RuntimeWarning)
+
+class ForestApplication(sf.Application):
+ def _chooseSceneManager(self):
+ # self.sceneManager = self.root.createSceneManager("TerrainSceneManager")
+ self.sceneManager = self.root.createSceneManager(ogre.ST_EXTERIOR_CLOSE)
+ # self.sceneManager.setShadowTechnique(ogre.SHADOWTYPE_TEXTURE_ADDITIVE)
+
+ def getTerrainHeight( self, x, z ):
+ if ( x < 0 or z < 0 or x > 1500 or z > 1500 ): return 0
+ self.updateRay.setOrigin( ogre.Vector3(x, 0.0, z) )
+ self.updateRay.setDirection( ogre.Vector3.UNIT_Y )
+ self.raySceneQuery.setRay( self.updateRay )
+ self.raySceneQuery.execute( self.raySceneQueryListener )
+ return self.raySceneQueryListener.resultDistance
+
+ ##Loads world
+ def _createScene(self):
+ camera = self.camera
+
+ ## Set ambient light
+ self.sceneManager.setAmbientLight((0.5, 0.5, 0.5))
+
+ ## Create a light
+ l = self.sceneManager.createLight("MainLight")
+ l.setPosition(20,80,50)
+ ## Fog
+ ## NB it's VERY important to set this before calling setWorldGeometry
+ ## because the vertex program picked will be different
+ ##ColourValue fadeColour(0.93, 0.86, 0.76)
+ fadeColour = (120.0/255, 173.0/255, 246.0/255)
+ self.sceneManager.setFog( ogre.FOG_LINEAR, fadeColour, .001, 200, 1000)
+ self.renderWindow.getViewport(0).setBackgroundColour(fadeColour)
+
+ terrain_cfg = "./triplanar_terrain.cfg"
+
+ self.sceneManager.setWorldGeometry( terrain_cfg )
+ ## Infinite far plane?
+ if self.root.getRenderSystem().getCapabilities().hasCapability(ogre.RSC_INFINITE_FAR_PLANE):
+ camera.setFarClipDistance(0)
+ ##camera.setFarClipDistance(1000)
+
+ ## Set a nice viewpoint
+ camera.setPosition(750,100,750)
+ camera.lookAt(750, 100, 750+1)
+ ##camera.setPolygonMode(PM_WIREFRAME)
+
+ plane = ogre.Plane()
+ n = plane.normal
+ n.x, n.y, n.z = 0, -1, 0
+ plane.d = 5000
+ self.sceneManager.setSkyPlane(True, plane, 'Examples/CloudySky', 1000, 3)
+
+ #self.sceneManager.setSkyPlane(True, 'Examples/CloudySky', 5, 8)
+
+
+ ##---- PagedGeometry test ----
+
+ ## TREES
+ ##Initialize the PagedGeometry engine
+ self.trees = forests.PagedGeometry()
+ self.trees.setCamera( camera )
+ self.trees.setPageSize( 100 )
+ self.trees.setBounds( ogre.FloatRect(0, 0, 1500, 1500) )
+
+ ##Set up LODs
+ ##self.trees.addDetailLevelEntityPage(50, 50)
+ self.trees.addDetailLevelBatchPage(50, 50)
+ self.trees.addDetailLevelImpostorPage(900, 50)
+
+ ##Set up a TreeLoader for easy use
+ self.treeLoader = forests.TreeLoader2D( self.trees, ogre.FloatRect(0, 0, 1500, 1500) )
+ self.trees.setPageLoader(self.treeLoader)
+ self.treeLoader.setHeightFunction(self, "getTerrainHeight")
+
+ ##And add 20,000 trees to the scene through the "easy-to-use" TreeLoader class
+ palm1 = self.sceneManager.createEntity("MyTree", "KinkyPalm.mesh")
+ palm2 = self.sceneManager.createEntity("pineTree", "StraightPalm.mesh")
+ palm3 = self.sceneManager.createEntity("palmBendy", "BendyPalm.mesh")
+ bush1 = self.sceneManager.createEntity("bush1", "BigDarkBush.mesh")
+ birch = self.sceneManager.createEntity("birch", "birch.mesh")
+ benTree = self.sceneManager.createEntity("benTree", "benTree.mesh")
+ spot_shroom = self.sceneManager.createEntity("redShroom", "spotty_shroom.mesh")
+ blue_shroom = self.sceneManager.createEntity("blueShroom", "blue_shroom.mesh")
+ beech = self.sceneManager.createEntity("beech", "beech_tree.mesh")
+
+ self.treeModels = [ bush1, benTree, spot_shroom, blue_shroom, beech]
+ # fix the damn rotations
+## rotNode = self.sceneManager.getRootSceneNode().createChildSceneNode( "rotNode" )
+## rotNode.attachObject( self.palm1 )
+## rotNode.attachObject( self.palm2 )
+## rotNode.attachObject( self.palm3 )
+## rotNode.attachObject( self.bush1 )
+## rotNode.pitch(ogre.Degree(-90).valueRadians())
+
+
+
+ x=0
+ z=0
+ for i in range (10000):
+ yaw = random.randrange(0, 360)
+
+ if (random.randrange(0, 1000) <= 800):
+ x += random.randrange(-10.0, 10.0)
+ z += random.randrange(-10.0, 10.0)
+ if (x < 0): x = 0
+ elif (x > 1500): x = 1500
+ if (z < 0): z = 0
+ elif (z > 1500): z = 1500
+ else:
+ x = random.randrange(0, 1500)
+ z = random.randrange(0, 1500)
+
+ scale = random.randrange(9, 20) / 10
+
+ t_type = random.randrange(0, len(self.treeModels))
+ self.treeLoader.addTree(self.treeModels[t_type], ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+
+## if t_type == 0:
+## self.treeLoader.addTree(self.palm1, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+## elif t_type == 1:
+## self.treeLoader.addTree(self.palm2, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+## elif t_type == 2:
+## self.treeLoader.addTree(self.palm3, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+## elif t_type == 3:
+## self.treeLoader.addTree(self.bush1, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+ ##Grass
+
+ ##Initialize the PagedGeometry engine
+ self.grass = forests.PagedGeometry(camera, 30)
+ ##trees = new PagedGeometry(camera, 50, ogre.FloatRect(0, 0, 1500, 1500))
+
+ ##Set up LODs
+ self.grass.addDetailLevelGrassPage(100.0,0.0)
+
+ ##Set up a TreeLoader for easy use
+ self.grassLoader = forests.GrassLoader(self.grass)
+ self.grass.setPageLoader(self.grassLoader)
+ self.grassLoader.setHeightFunction(self, "getTerrainHeight")
+
+ ## iterate grass materials
+ for nam in ["grass", "dry_grass", "tall_grass"]:
+ grassLayer = self.grassLoader.addLayer(nam)
+
+ grassLayer.setAnimationEnabled(True)
+ grassLayer.setSwaySpeed(1.5)
+ grassLayer.setSwayLength(0.08)
+ grassLayer.setSwayDistribution(10.0)
+
+ grassLayer.setDensity(0.6)
+
+ grassLayer.setMapBounds(ogre.FloatRect(0, 0, 1500, 1500))
+
+ grassLayer.setColorMap("terrain_texture_greeb.jpg")
+ grassLayer.setColorMapFilter(forests.MAPFILTER_BILINEAR)
+
+ grassLayer.setDensityMap("densitymap.png")
+ grassLayer.setDensityMapFilter(forests.MAPFILTER_NONE)
+
+ ##grassLayer.setMinimumSize(0.5,0.5)
+ ##grassLayer.setMaximumSize(1.0, 1.0)
+
+ grassLayer.setMinimumSize(4.0,2.0)
+ grassLayer.setMaximumSize(4.0,2.0)
+
+ grassLayer.setFadeTechnique(forests.FADETECH_GROW)
+
+ self.robots = []
+
+ for i in range(5):
+ robo = Robot(self)
+ robo.spawn(ogre.Vector3(700 + (i * 10), 100, 750), i)
+ self.robots.append(robo)
+
+
+
+ #rNode.translate(ogre.Vector3(750,70,760))
+ #rNode.setScale(ogre.Vector3(0.5,0.5,0.5))
+
+ self.updateRay = ogre.Ray();
+
+ ##RaySceneQuery for terrain height check
+ self.updateRay.setOrigin(camera.getPosition())
+ self.updateRay.setDirection(ogre.Vector3.NEGATIVE_UNIT_Y)
+ self.raySceneQuery = self.sceneManager.createRayQuery(self.updateRay)
+ self.raySceneQuery.setQueryTypeMask(ogre.SceneManager.WORLD_GEOMETRY_TYPE_MASK )
+ self.raySceneQuery.setWorldFragmentType(ogre.SceneQuery.WFT_SINGLE_INTERSECTION)
+ self.raySceneQueryListener = myRaySceneQueryListener()
+
+ tipi_ent = self.sceneManager.createEntity("tipi", "tipi.mesh")
+ tipi_node = self.sceneManager.getRootSceneNode().createChildSceneNode()
+ tipi_node.attachObject(tipi_ent)
+ tipi_node.setPosition(ogre.Vector3(700, 100, 750))
+ pos = tipi_node.getPosition()
+ tipi_node.setPosition(pos.x, self.getTerrainHeight(700,750) + 0, pos.z)
+
+ def _createFrameListener(self):
+ self.frameListener = GrassFrameListener(self)
+ self.root.addFrameListener(self.frameListener)
+
+ self.roboListener = robotsListener(self)
+ self.root.addFrameListener(self.roboListener)
+
+
+class Robot:
+ def __init__(self, app):
+ self.app = app
+ self.speed = 5.0
+ self.decisionTime = 5.0
+ self.direction = ogre.Vector2(random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0))
+ self.mustRotate = True
+
+ def spawn(self, position, numActors):
+ self.timer = 0.0
+ self.ent = self.app.sceneManager.createEntity("robot_" + str(numActors), "robot.mesh")
+ self.posNode = self.app.sceneManager.getRootSceneNode().createChildSceneNode()
+ self.rotNode = self.posNode.createChildSceneNode()
+ self.posNode.setScale(ogre.Vector3(0.1, 0.1, 0.1))
+ self.rotNode.attachObject(self.ent)
+ self.posNode.setPosition(position)
+ self.rotNode.yaw(ogre.Degree(90))
+ print self.posNode.position
+ self.animation = self.ent.getAnimationState('Walk')
+ self.animation.Enabled = True
+
+
+
+ def addTime(self, time):
+ self.animation.addTime(time)
+ #print self.Node.position
+ self.timer += time
+ if self.timer >= self.decisionTime:
+ self.timer = 0
+ self.direction = ogre.Vector2(random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0))
+ self.direction.normalise()
+ self.mustRotate = True
+ self.posNode.setDirection(self.direction.x, 0, self.direction.y, self.posNode.TS_WORLD)
+ print self.posNode.position
+ if self.mustRotate:
+ pass
+
+ pos = self.posNode.position
+ off = self.direction * (self.speed * time)
+ self.posNode.setPosition(pos.x + off.x, pos.y, pos.z + off.y)
+
+
+
+class robotsListener(sf.FrameListener):
+ def __init__(self, app):
+ sf.FrameListener.__init__(self, app.renderWindow, app.camera)
+ self.app = app
+ self.raySceneQuery = app.sceneManager.createRayQuery(ogre.Ray(app.camera.getPosition(),
+ ogre.Vector3.NEGATIVE_UNIT_Y))
+ self.Ray = ogre.Ray()
+
+
+ def frameStarted(self, frameEvent):
+ for r in self.app.robots:
+ r.addTime(frameEvent.timeSinceLastFrame)
+ self.Ray.setOrigin(r.posNode.position)
+ self.Ray.setDirection(ogre.Vector3.NEGATIVE_UNIT_Y)
+ self.raySceneQuery.Ray = self.Ray
+ for queryResult in self.raySceneQuery.execute():
+ if queryResult.worldFragment is not None:
+ pos = r.posNode.position
+ r.posNode.setPosition(pos.x, pos.y - queryResult.distance + 0.6, pos.z)
+ break
+ return sf.FrameListener.frameStarted(self, frameEvent)
+
+class GrassFrameListener(sf.FrameListener):
+ def __init__(self, app):
+ sf.FrameListener.__init__(self, app.renderWindow, app.camera)
+ self.app = app
+ self.timeSince = 0.0
+ self.updateToggle = True
+ # use this to tweak the persons position
+ self.raySceneQuery = app.sceneManager.createRayQuery(ogre.Ray(app.camera.getPosition(),
+ ogre.Vector3.NEGATIVE_UNIT_Y))
+
+
+ def frameStarted(self, frameEvent):
+ if self.updateToggle:
+ self.app.trees.update()
+ else:
+ self.app.grass.update()
+ self.updateToggle = not self.updateToggle
+ self.app.grassLoader.updateAnimation()
+ self.timeSince = frameEvent.timeSinceLastFrame
+ 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 + 18.0, pos.z)
+ break
+ return sf.FrameListener.frameStarted(self, frameEvent)
+
+ def _moveCamera(self):
+ self.camera.yaw(self.rotationX)
+ self.camera.pitch(self.rotationY)
+ try:
+ self.camera.translate(self.translateVector * 0.1 * self.timeSince) # for using OgreRefApp
+ except AttributeError:
+ self.camera.moveRelative(self.translateVector * 0.1 * self.timeSince)
+
+
+class myRaySceneQueryListener ( ogre.RaySceneQueryListener ):
+ def queryResult(self, fragment, distance):
+ self.resultDistance = distance
+ return False
+
+
+if __name__ == '__main__':
+ try:
+ application = ForestApplication()
+ application.go()
+ except ogre.OgreException, e:
+ print e
Added: trunk/python-ogre/demos/showcase_01/Demo_Forest.py.bak
===================================================================
--- trunk/python-ogre/demos/showcase_01/Demo_Forest.py.bak (rev 0)
+++ trunk/python-ogre/demos/showcase_01/Demo_Forest.py.bak 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,326 @@
+
+
+
+
+import warnings
+warnings.simplefilter('ignore', RuntimeWarning)
+import ogre.renderer.OGRE as ogre
+import ogre.addons.ogreforests as forests
+import SampleFramework as sf
+import math, random
+warnings.simplefilter('default', RuntimeWarning)
+
+class ForestApplication(sf.Application):
+ def _chooseSceneManager(self):
+ # self.sceneManager = self.root.createSceneManager("TerrainSceneManager")
+ self.sceneManager = self.root.createSceneManager(ogre.ST_EXTERIOR_CLOSE)
+ # self.sceneManager.setShadowTechnique(ogre.SHADOWTYPE_TEXTURE_ADDITIVE)
+
+ def getTerrainHeight( self, x, z ):
+ if ( x < 0 or z < 0 or x > 1500 or z > 1500 ): return 0
+ self.updateRay.setOrigin( ogre.Vector3(x, 0.0, z) )
+ self.updateRay.setDirection( ogre.Vector3.UNIT_Y )
+ self.raySceneQuery.setRay( self.updateRay )
+ self.raySceneQuery.execute( self.raySceneQueryListener )
+ return self.raySceneQueryListener.resultDistance
+
+ ##Loads world
+ def _createScene(self):
+ camera = self.camera
+
+ ## Set ambient light
+ self.sceneManager.setAmbientLight((0.5, 0.5, 0.5))
+
+ ## Create a light
+ l = self.sceneManager.createLight("MainLight")
+ l.setPosition(20,80,50)
+ ## Fog
+ ## NB it's VERY important to set this before calling setWorldGeometry
+ ## because the vertex program picked will be different
+ ##ColourValue fadeColour(0.93, 0.86, 0.76)
+ fadeColour = (120.0/255, 173.0/255, 246.0/255)
+ self.sceneManager.setFog( ogre.FOG_LINEAR, fadeColour, .001, 200, 1000)
+ self.renderWindow.getViewport(0).setBackgroundColour(fadeColour)
+
+ terrain_cfg = "./triplanar_terrain.cfg"
+
+ self.sceneManager.setWorldGeometry( terrain_cfg )
+ ## Infinite far plane?
+ if self.root.getRenderSystem().getCapabilities().hasCapability(ogre.RSC_INFINITE_FAR_PLANE):
+ camera.setFarClipDistance(0)
+ ##camera.setFarClipDistance(1000)
+
+ ## Set a nice viewpoint
+ camera.setPosition(750,100,750)
+ camera.lookAt(750, 100, 750+1)
+ ##camera.setPolygonMode(PM_WIREFRAME)
+
+ plane = ogre.Plane()
+ n = plane.normal
+ n.x, n.y, n.z = 0, -1, 0
+ plane.d = 5000
+ self.sceneManager.setSkyPlane(True, plane, 'Examples/CloudySky', 1000, 3)
+
+ #self.sceneManager.setSkyPlane(True, 'Examples/CloudySky', 5, 8)
+
+
+ ##---- PagedGeometry test ----
+
+ ## TREES
+ ##Initialize the PagedGeometry engine
+ self.trees = forests.PagedGeometry()
+ self.trees.setCamera( camera )
+ self.trees.setPageSize( 100 )
+ self.trees.setBounds( ogre.FloatRect(0, 0, 1500, 1500) )
+
+ ##Set up LODs
+ ##self.trees.addDetailLevelEntityPage(50, 50)
+ self.trees.addDetailLevelBatchPage(50, 50)
+ self.trees.addDetailLevelImpostorPage(900, 50)
+
+ ##Set up a TreeLoader for easy use
+ self.treeLoader = forests.TreeLoader2D( self.trees, ogre.FloatRect(0, 0, 1500, 1500) )
+ self.trees.setPageLoader(self.treeLoader)
+ self.treeLoader.setHeightFunction(self, "getTerrainHeight")
+
+ ##And add 20,000 trees to the scene through the "easy-to-use" TreeLoader class
+ palm1 = self.sceneManager.createEntity("MyTree", "KinkyPalm.mesh")
+ palm2 = self.sceneManager.createEntity("pineTree", "StraightPalm.mesh")
+ palm3 = self.sceneManager.createEntity("palmBendy", "BendyPalm.mesh")
+ bush1 = self.sceneManager.createEntity("bush1", "BigDarkBush.mesh")
+ birch = self.sceneManager.createEntity("birch", "birch.mesh")
+ benTree = self.sceneManager.createEntity("benTree", "benTree.mesh")
+ spot_shroom = self.sceneManager.createEntity("redShroom", "spotty_shroom.mesh")
+ blue_shroom = self.sceneManager.createEntity("blueShroom", "blue_shroom.mesh")
+
+ self.treeModels = [ bush1, benTree, spot_shroom, blue_shroom]
+ # fix the damn rotations
+## rotNode = self.sceneManager.getRootSceneNode().createChildSceneNode( "rotNode" )
+## rotNode.attachObject( self.palm1 )
+## rotNode.attachObject( self.palm2 )
+## rotNode.attachObject( self.palm3 )
+## rotNode.attachObject( self.bush1 )
+## rotNode.pitch(ogre.Degree(-90).valueRadians())
+
+
+
+ x=0
+ z=0
+ for i in range (10000):
+ yaw = random.randrange(0, 360)
+
+ if (random.randrange(0, 1000) <= 800):
+ x += random.randrange(-10.0, 10.0)
+ z += random.randrange(-10.0, 10.0)
+ if (x < 0): x = 0
+ elif (x > 1500): x = 1500
+ if (z < 0): z = 0
+ elif (z > 1500): z = 1500
+ else:
+ x = random.randrange(0, 1500)
+ z = random.randrange(0, 1500)
+
+ scale = random.randrange(9, 20) / 10
+
+ t_type = random.randrange(0, len(self.treeModels))
+ self.treeLoader.addTree(self.treeModels[t_type], ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+
+## if t_type == 0:
+## self.treeLoader.addTree(self.palm1, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+## elif t_type == 1:
+## self.treeLoader.addTree(self.palm2, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+## elif t_type == 2:
+## self.treeLoader.addTree(self.palm3, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+## elif t_type == 3:
+## self.treeLoader.addTree(self.bush1, ogre.Vector2(x, z), ogre.Degree(yaw), scale)
+ ##Grass
+
+ ##Initialize the PagedGeometry engine
+ self.grass = forests.PagedGeometry(camera, 30)
+ ##trees = new PagedGeometry(camera, 50, ogre.FloatRect(0, 0, 1500, 1500))
+
+ ##Set up LODs
+ self.grass.addDetailLevelGrassPage(100.0,0.0)
+
+ ##Set up a TreeLoader for easy use
+ self.grassLoader = forests.GrassLoader(self.grass)
+ self.grass.setPageLoader(self.grassLoader)
+ self.grassLoader.setHeightFunction(self, "getTerrainHeight")
+
+ ## iterate grass materials
+ for nam in ["grass", "dry_grass"]:
+ grassLayer = self.grassLoader.addLayer(nam)
+
+ grassLayer.setAnimationEnabled(True)
+ grassLayer.setSwaySpeed(1.5)
+ grassLayer.setSwayLength(0.08)
+ grassLayer.setSwayDistribution(10.0)
+
+ grassLayer.setDensity(0.6)
+
+ grassLayer.setMapBounds(ogre.FloatRect(0, 0, 1500, 1500))
+
+ grassLayer.setColorMap("terrain_texture_greeb.jpg")
+ grassLayer.setColorMapFilter(forests.MAPFILTER_BILINEAR)
+
+ grassLayer.setDensityMap("densitymap.png")
+ grassLayer.setDensityMapFilter(forests.MAPFILTER_NONE)
+
+ ##grassLayer.setMinimumSize(0.5,0.5)
+ ##grassLayer.setMaximumSize(1.0, 1.0)
+
+ grassLayer.setMinimumSize(4.0,2.0)
+ grassLayer.setMaximumSize(4.0,2.0)
+
+ grassLayer.setFadeTechnique(forests.FADETECH_GROW)
+
+ self.robots = []
+
+ for i in range(5):
+ robo = Robot(self)
+ robo.spawn(ogre.Vector3(700 + (i * 10), 100, 750), i)
+ self.robots.append(robo)
+
+ tipi_ent = self.sceneManager.createEntity("tipi", "tipi.mesh")
+ tipi_node = self.sceneManager.getRootSceneNode().createChildSceneNode()
+ tipi_node.attachObject(tipi_ent)
+ tipi_node.setPosition(ogre.Vector3(700, 100, 750))
+ tipi_node.position.y = self.getTerrainHeight(700,750)
+
+ #rNode.translate(ogre.Vector3(750,70,760))
+ #rNode.setScale(ogre.Vector3(0.5,0.5,0.5))
+
+ self.updateRay = ogre.Ray();
+
+ ##RaySceneQuery for terrain height check
+ self.updateRay.setOrigin(camera.getPosition())
+ self.updateRay.setDirection(ogre.Vector3.NEGATIVE_UNIT_Y)
+ self.raySceneQuery = self.sceneManager.createRayQuery(self.updateRay)
+ self.raySceneQuery.setQueryTypeMask(ogre.SceneManager.WORLD_GEOMETRY_TYPE_MASK )
+ self.raySceneQuery.setWorldFragmentType(ogre.SceneQuery.WFT_SINGLE_INTERSECTION)
+ self.raySceneQueryListener = myRaySceneQueryListener()
+
+ def _createFrameListener(self):
+ self.frameListener = GrassFrameListener(self)
+ self.root.addFrameListener(self.frameListener)
+
+ self.roboListener = robotsListener(self)
+ self.root.addFrameListener(self.roboListener)
+
+
+class Robot:
+ def __init__(self, app):
+ self.app = app
+ self.speed = 5.0
+ self.decisionTime = 5.0
+ self.direction = ogre.Vector2(random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0))
+ self.mustRotate = True
+
+ def spawn(self, position, numActors):
+ self.timer = 0.0
+ self.ent = self.app.sceneManager.createEntity("robot_" + str(numActors), "robot.mesh")
+ self.posNode = self.app.sceneManager.getRootSceneNode().createChildSceneNode()
+ self.rotNode = self.posNode.createChildSceneNode()
+ self.posNode.setScale(ogre.Vector3(0.1, 0.1, 0.1))
+ self.rotNode.attachObject(self.ent)
+ self.posNode.setPosition(position)
+ self.rotNode.yaw(ogre.Degree(90))
+ print self.posNode.position
+ self.animation = self.ent.getAnimationState('Walk')
+ self.animation.Enabled = True
+
+
+
+ def addTime(self, time):
+ self.animation.addTime(time)
+ #print self.Node.position
+ self.timer += time
+ if self.timer >= self.decisionTime:
+ self.timer = 0
+ self.direction = ogre.Vector2(random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0))
+ self.direction.normalise()
+ self.mustRotate = True
+ self.posNode.setDirection(self.direction.x, 0, self.direction.y, self.posNode.TS_WORLD)
+ print self.posNode.position
+ if self.mustRotate:
+ pass
+
+ pos = self.posNode.position
+ off = self.direction * (self.speed * time)
+ self.posNode.setPosition(pos.x + off.x, pos.y, pos.z + off.y)
+
+
+
+class robotsListener(sf.FrameListener):
+ def __init__(self, app):
+ sf.FrameListener.__init__(self, app.renderWindow, app.camera)
+ self.app = app
+ self.raySceneQuery = app.sceneManager.createRayQuery(ogre.Ray(app.camera.getPosition(),
+ ogre.Vector3.NEGATIVE_UNIT_Y))
+ self.Ray = ogre.Ray()
+
+
+ def frameStarted(self, frameEvent):
+ for r in self.app.robots:
+ r.addTime(frameEvent.timeSinceLastFrame)
+ self.Ray.setOrigin(r.posNode.position)
+ self.Ray.setDirection(ogre.Vector3.NEGATIVE_UNIT_Y)
+ self.raySceneQuery.Ray = self.Ray
+ for queryResult in self.raySceneQuery.execute():
+ if queryResult.worldFragment is not None:
+ pos = r.posNode.position
+ r.posNode.setPosition(pos.x, pos.y - queryResult.distance + 0.6, pos.z)
+ break
+ return sf.FrameListener.frameStarted(self, frameEvent)
+
+class GrassFrameListener(sf.FrameListener):
+ def __init__(self, app):
+ sf.FrameListener.__init__(self, app.renderWindow, app.camera)
+ self.app = app
+ self.timeSince = 0.0
+ self.updateToggle = True
+ # use this to tweak the persons position
+ self.raySceneQuery = app.sceneManager.createRayQuery(ogre.Ray(app.camera.getPosition(),
+ ogre.Vector3.NEGATIVE_UNIT_Y))
+
+
+ def frameStarted(self, frameEvent):
+ if self.updateToggle:
+ self.app.trees.update()
+ else:
+ self.app.grass.update()
+ self.updateToggle = not self.updateToggle
+ self.app.grassLoader.updateAnimation()
+ self.timeSince = frameEvent.timeSinceLastFrame
+ 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 + 18.0, pos.z)
+ break
+ return sf.FrameListener.frameStarted(self, frameEvent)
+
+ def _moveCamera(self):
+ self.camera.yaw(self.rotationX)
+ self.camera.pitch(self.rotationY)
+ try:
+ self.camera.translate(self.translateVector * 0.1 * self.timeSince) # for using OgreRefApp
+ except AttributeError:
+ self.camera.moveRelative(self.translateVector * 0.1 * self.timeSince)
+
+
+class myRaySceneQueryListener ( ogre.RaySceneQueryListener ):
+ def queryResult(self, fragment, distance):
+ self.resultDistance = distance
+ return False
+
+
+if __name__ == '__main__':
+ try:
+ application = ForestApplication()
+ application.go()
+ except ogre.OgreException, e:
+ print e
Added: trunk/python-ogre/demos/showcase_01/Ogre.log
===================================================================
--- trunk/python-ogre/demos/showcase_01/Ogre.log (rev 0)
+++ trunk/python-ogre/demos/showcase_01/Ogre.log 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,30 @@
+08:23:00: Creating resource group General
+08:23:00: Creating resource group Internal
+08:23:00: Creating resource group Autodetect
+08:23:00: SceneManagerFactory for type 'DefaultSceneManager' registered.
+08:23:00: Registering ResourceManager for type Material
+08:23:00: Registering ResourceManager for type Mesh
+08:23:00: Registering ResourceManager for type Skeleton
+08:23:00: MovableObjectFactory for type 'ParticleSystem' registered.
+08:23:00: OverlayElementFactory for type Panel registered.
+08:23:00: OverlayElementFactory for type BorderPanel registered.
+08:23:00: OverlayElementFactory for type TextArea registered.
+08:23:00: Registering ResourceManager for type Font
+08:23:00: ArchiveFactory for archive type FileSystem registered.
+08:23:00: ArchiveFactory for archive type Zip registered.
+08:23:00: FreeImage version: 3.9.2
+08:23:00: This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details
+08:23:00: Supported formats: bmp,ico,jpg,jif,jpeg,jpe,jng,koa,iff,lbm,mng,pbm,pbm,pcd,pcx,pgm,pgm,png,ppm,ppm,ras,tga,targa,tif,tiff,wap,wbmp,wbm,psd,cut,xbm,xpm,gif,hdr,g3,sgi
+08:23:00: DDS codec registering
+08:23:00: Registering ResourceManager for type HighLevelGpuProgram
+08:23:00: Registering ResourceManager for type Compositor
+08:23:00: MovableObjectFactory for type 'Entity' registered.
+08:23:00: MovableObjectFactory for type 'Light' registered.
+08:23:00: MovableObjectFactory for type 'BillboardSet' registered.
+08:23:00: MovableObjectFactory for type 'ManualObject' registered.
+08:23:00: MovableObjectFactory for type 'BillboardChain' registered.
+08:23:00: MovableObjectFactory for type 'RibbonTrail' registered.
+08:23:00: Loading library ../../plugins\RenderSystem_GL.dll
+08:23:00: OGRE EXCEPTION(7:InternalErrorException): Could not load dynamic library ../../plugins\RenderSystem_GL.dll. System Error: The specified module could not be found.
+
+ in DynLib::load at ..\src\OgreDynLib.cpp (line 80)
Added: trunk/python-ogre/demos/showcase_01/SampleFramework.py
===================================================================
--- trunk/python-ogre/demos/showcase_01/SampleFramework.py (rev 0)
+++ trunk/python-ogre/demos/showcase_01/SampleFramework.py 2007-10-23 00:32:24 UTC (rev 453)
@@ -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/showcase_01/media/Triplanar/New Text Document.txt
===================================================================
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg
===================================================================
--- trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg (rev 0)
+++ trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,125 @@
+// Linear fogged morphing terrain
+void OverhangTerrain_vp_linear_cg(
+ float4 position : POSITION,
+// float2 uv1 : TEXCOORD0,
+// float2 uv2 : TEXCOORD1,
+ float delta : BLENDWEIGHT,
+
+ out float4 oPosition : POSITION,
+ out float2 oUv1 : TEXCOORD0,
+ out float2 oUv2 : TEXCOORD1,
+ out float4 colour : COLOR,
+ out float fog : FOG,
+ uniform float4x4 worldViewProj,
+ uniform float4x4 world,
+ uniform float morphFactor
+ )
+{
+ float2 protoUv = mul(world, position).xz;
+ // Main texture coords
+ oUv1 = protoUv / 1500;
+ // Detail texture coords
+ oUv2 = protoUv / 62.5;
+ // Apply morph
+ position.y = position.y + (delta.x * morphFactor);
+ // world / view / projection
+ oPosition = mul(worldViewProj, position);
+ // Full bright (no lighting)
+ colour = float4(1,1,1,1);
+ // Fog
+ // f = end - camz / end - start
+ // when start / end has been set, fog value is distance
+ fog = oPosition.z;
+}
+
+void OverhangTerrain_fp_cg (
+ float2 uv1 : TEXCOORD0,
+ float2 uv2 : TEXCOORD1,
+ float fog : FOG,
+
+ out float4 color : COLOR,
+
+ uniform sampler2D worldTex,
+ uniform sampler2D detailTex
+ )
+ {
+ color = tex2D(worldTex, uv1) * tex2D(detailTex, uv2);
+// color = float4(1, 1,1,1);
+// color = color * (1-fog);
+ }
+
+//
+void OverhangTerrain_vp_linear_triplanar_cg(
+ float4 position : POSITION,
+ float delta : BLENDWEIGHT,
+ float3 normal : NORMAL,
+
+ out float4 oPosition : POSITION,
+ out float2 oUv1 : TEXCOORD0,
+ out float3 oUv2 : TEXCOORD1,
+ out float4 colour : COLOR,
+ out float fog : TEXCOORD3,
+ out float3 oNormal : TEXCOORD2,
+ uniform float4x4 worldViewProj,
+ uniform float4x4 world,
+ uniform float morphFactor
+ )
+{
+ float3 protoUv = mul(world, position);
+ // Main texture coords
+ oUv1 = (protoUv / 1500).xz;
+ // Detail texture coords
+ oUv2 = protoUv / 62.5;
+ // Apply morph
+ position.y = position.y + (delta.x * morphFactor);
+ // world / view / projection
+ oPosition = mul(worldViewProj, position);
+ // Full bright (no lighting)
+ colour = float4(1,1,1,1);
+ // Fog
+ // f = end - camz / end - start
+ // when start / end has been set, fog value is distance
+ fog = oPosition.z / 1500;
+ oNormal = normal;
+}
+
+void OverhangTerrain_fp_triplanar_cg (
+ float2 uv1 : TEXCOORD0,
+ float3 uv2 : TEXCOORD1,
+ float3 normal : TEXCOORD2,
+ float fog : TEXCOORD3,
+
+ out float4 color : COLOR,
+
+ uniform sampler2D worldTex : register(s0),
+ uniform sampler2D detailTex : register(s1),
+ uniform sampler2D rock : register(s2)
+ )
+ {
+ //taken from Cascades DX10 demo.
+ float3 blendWeights = normalize(normal);
+ blendWeights = abs(blendWeights);
+ blendWeights *= float3(7,7,7);
+ blendWeights = pow(blendWeights, float3(3,3,3));
+ blendWeights = max(float3(0.0,0.0,0.0), blendWeights);
+ //so they sum to 1.0:
+ blendWeights /= dot(blendWeights, float3(1.0,1.0,1.0));
+
+ float4 worldColor = tex2D(worldTex, uv1);
+ float4 color1 = tex2D(rock, uv2.xy*3);
+ float4 color2 = tex2D(rock, uv2.yz*3);
+ float4 color3;
+ if(normal.y < 0.0)
+ color3 = tex2D(rock, uv2.xz*3);
+ else
+ color3 = tex2D(detailTex, uv2.xz);
+// float4 color1 = float4(1,0,0,1);
+// float4 color2 = float4(0,1,0,1);
+// float4 color3 = float4(0,0,1,1);
+
+ color = color1*blendWeights.z + color2*blendWeights.x + color3*blendWeights.y;
+// color = color1*normal.z + color2*normal.x + color3*normal.y;
+ color *= worldColor;
+ color = color * (1-fog) + float4(0.93, 0.86, 0.76, 1.0)*fog;
+ }
+
\ No newline at end of file
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.bak
===================================================================
--- trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.bak (rev 0)
+++ trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.bak 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,150 @@
+
+
+void OverhangTerrain_vp_linear_triplanar_cg(
+ float4 position : POSITION,
+ float delta : BLENDWEIGHT,
+ float4 normal : NORMAL,
+
+ out float4 oPosition : POSITION,
+ out float2 oUv1 : TEXCOORD0,
+ out float3 oUv2 : TEXCOORD1,
+ out float4 colour : COLOR,
+ out float fog : TEXCOORD3,
+ out float3 oNormal : TEXCOORD2,
+ out float4 tangent : TEXCOORD4,
+ out float4 binormal : TEXCOORD5,
+
+ uniform float4x4 worldViewProj,
+ uniform float4 lightPos,
+ uniform float4 ambient,
+ uniform float4 lightDiffuseColour,
+ uniform float4x4 world,
+ uniform float morphFactor
+ )
+{
+ float3 protoUv = mul(world, position);
+ // Main texture coords
+ oUv1 = (protoUv / 1500).xz;
+ // Detail texture coords
+ oUv2 = protoUv / 62.5;
+ // Apply morph
+ position.y = position.y + (delta.x * morphFactor);
+ // world / view / projection
+ oPosition = mul(worldViewProj, position);
+ // Full bright (no lighting)
+ //colour = float4(0.5,0.5,0.5,1);
+ // Fog
+ // f = end - camz / end - start
+ // when start / end has been set, fog value is distance
+ fog = oPosition.z / 1500;
+ oNormal = normal;
+
+ float3 lightDir = normalize(
+ lightPos.xyz - (position.xyz * lightPos.w));
+
+ //colour = ambient + saturate(dot(lightDir, normal)) * lightDiffuseColour;
+ colour = float4(0.0, 0.0, 0.0, 1.0);
+
+ //tangent = normalize(worldViewProj[1] - (position * worldViewProj[1].w));
+ //binormal = dot(tangent, normal);
+}
+
+
+
+void OverhangTerrain_fp_triplanar_cg (
+ //float4 pos : POSITION,
+ float2 uv1 : TEXCOORD0,
+ float3 uv2 : TEXCOORD1,
+ float4 normal : TEXCOORD2,
+ float fog : TEXCOORD3,
+ float4 col : COLOR,
+
+
+ // shadows
+ //float4 tangent : TEXCOORD4,
+ //float4 binormal : TEXCOORD5,
+ //
+
+ out float4 color : COLOR,
+
+ uniform float4 lightPos,
+ uniform float4 ambient,
+ uniform float4 lightDiffuseColour,
+
+ uniform sampler2D worldTex : register(s0),
+ uniform sampler2D detailTex : register(s1),
+ uniform sampler2D rock : register(s2),
+ uniform sampler2D normTex: register(s3)
+ )
+ {
+ //taken from Cascades DX10 demo.
+ float3 blendWeights = normalize(normal);
+ blendWeights = abs(blendWeights);
+ blendWeights *= float3(7,7,7);
+ blendWeights = pow(blendWeights, float3(3,3,3));
+ blendWeights = max(float3(0.0,0.0,0.0), blendWeights);
+ //so they sum to 1.0:
+ blendWeights /= dot(blendWeights, float3(1.0,1.0,1.0));
+
+ float4 worldColor = tex2D(worldTex, uv1);
+ float4 color1 = tex2D(rock, uv2.xy*3);
+ float4 color2 = tex2D(rock, uv2.yz*3);
+ float4 color3;
+ if(normal.y < 0.0)
+ color3 = tex2D(rock, uv2.xz*3);
+ else
+ color3 = tex2D(detailTex, uv2.xz);
+ float4 color1 = float4(1,0,0,1);
+ float4 color2 = float4(0,1,0,1);
+ float4 color3 = float4(0,0,1,1);
+
+ //float3 lightDir = normalize(
+ //lightPos.xyz - (uv2.xyz * lightPos.w));
+
+ //float4 lightcolour = ambient + saturate(dot(lightDir, normal)) * lightDiffuseColour;
+
+ //fog = ambient;
+ //color = color1*blendWeights.z + color2*blendWeights.x + color3*blendWeights.y;
+ color = color1*normal.z + color2*normal.x + color3*normal.y;
+ //color *= lightcolour;
+ //color = color * (1-fog) + ambient*fog;
+ //color *= 0.8;
+
+
+ // SHADOWS -------------------------------
+ // compute light ray vector in texture space
+
+ float4 tangent = tex2D(worldTex, uv1.xy);
+ float4 binormal = dot(tangent, normal);
+
+ float depth = 4.0;
+ float4 scale= float4(tangent.w, binormal.w, depth, 1.0);
+ float light_depth_bias=(2*lightPos.z-lightPos.z*lightPos.z);
+ lightPos.xy*=light_depth_bias;
+ lightPos.z=-lightPos.z;
+ lightPos*=scale.z/(scale*lightPos.z);
+
+ //compute light ray entry point in texture space
+ float3 lp=uv2-lightPos.xyz*uv2.z;
+ //ray_intersect_rm_linear(normTex,lp,lightPos);
+
+
+ const int linear_search_steps=6;
+
+ lightPos/=linear_search_steps;
+
+ for( int i=0;i<linear_search_steps-1;i++ ) {
+
+ float4 t=tex2D(worldTex,lp.xy);
+ if (lp.z<t.w)
+ lp+=lightPos;
+ }
+
+
+ if (lp.z<uv2.z-0.05) // if pixel in shadow
+ {
+ color*=0.25;
+ }
+ // ------------------------------------
+
+ }
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.old
===================================================================
--- trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.old (rev 0)
+++ trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.cg.old 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,150 @@
+
+
+void OverhangTerrain_vp_linear_triplanar_cg(
+ float4 position : POSITION,
+ float delta : BLENDWEIGHT,
+ float4 normal : NORMAL,
+
+ out float4 oPosition : POSITION,
+ out float2 oUv1 : TEXCOORD0,
+ out float3 oUv2 : TEXCOORD1,
+ out float4 colour : COLOR,
+ out float fog : TEXCOORD3,
+ out float3 oNormal : TEXCOORD2,
+ out float4 tangent : TEXCOORD4,
+ out float4 binormal : TEXCOORD5,
+
+ uniform float4x4 worldViewProj,
+ uniform float4 lightPos,
+ uniform float4 ambient,
+ uniform float4 lightDiffuseColour,
+ uniform float4x4 world,
+ uniform float morphFactor
+ )
+{
+ float3 protoUv = mul(world, position);
+ // Main texture coords
+ oUv1 = (protoUv / 1500).xz;
+ // Detail texture coords
+ oUv2 = protoUv / 62.5;
+ // Apply morph
+ position.y = position.y + (delta.x * morphFactor);
+ // world / view / projection
+ oPosition = mul(worldViewProj, position);
+ // Full bright (no lighting)
+ //colour = float4(0.5,0.5,0.5,1);
+ // Fog
+ // f = end - camz / end - start
+ // when start / end has been set, fog value is distance
+ fog = oPosition.z / 1500;
+ oNormal = normal;
+
+ float3 lightDir = normalize(
+ lightPos.xyz - (position.xyz * lightPos.w));
+
+ //colour = ambient + saturate(dot(lightDir, normal)) * lightDiffuseColour;
+ colour = float4(0.0, 0.0, 0.0, 1.0);
+
+ //tangent = normalize(worldViewProj[1] - (position * worldViewProj[1].w));
+ //binormal = dot(tangent, normal);
+}
+
+
+
+void OverhangTerrain_fp_triplanar_cg (
+ //float4 pos : POSITION,
+ float2 uv1 : TEXCOORD0,
+ float3 uv2 : TEXCOORD1,
+ float4 normal : TEXCOORD2,
+ float fog : TEXCOORD3,
+ float4 col : COLOR,
+
+
+ // shadows
+ //float4 tangent : TEXCOORD4,
+ //float4 binormal : TEXCOORD5,
+ //
+
+ out float4 color : COLOR,
+
+ uniform float4 lightPos,
+ uniform float4 ambient,
+ uniform float4 lightDiffuseColour,
+
+ uniform sampler2D worldTex : register(s0),
+ uniform sampler2D detailTex : register(s1),
+ uniform sampler2D rock : register(s2),
+ uniform sampler2D normTex: register(s3)
+ )
+ {
+ //taken from Cascades DX10 demo.
+ float3 blendWeights = normalize(normal);
+ blendWeights = abs(blendWeights);
+ blendWeights *= float3(7,7,7);
+ blendWeights = pow(blendWeights, float3(3,3,3));
+ blendWeights = max(float3(0.0,0.0,0.0), blendWeights);
+ //so they sum to 1.0:
+ blendWeights /= dot(blendWeights, float3(1.0,1.0,1.0));
+
+ float4 worldColor = tex2D(worldTex, uv1);
+ //float4 color1 = tex2D(rock, uv2.xy*3);
+ //float4 color2 = tex2D(rock, uv2.yz*3);
+ //float4 color3;
+ //if(normal.y < 0.0)
+ //color3 = tex2D(rock, uv2.xz*3);
+ //else
+ //color3 = tex2D(detailTex, uv2.xz);
+ float4 color1 = float4(1,0,0,1);
+ float4 color2 = float4(0,1,0,1);
+ float4 color3 = float4(0,0,1,1);
+
+ //float3 lightDir = normalize(
+ //lightPos.xyz - (uv2.xyz * lightPos.w));
+
+ //float4 lightcolour = ambient + saturate(dot(lightDir, normal)) * lightDiffuseColour;
+
+ //fog = ambient;
+ //color = color1*blendWeights.z + color2*blendWeights.x + color3*blendWeights.y;
+ color = color1*normal.z + color2*normal.x + color3*normal.y;
+ //color *= lightcolour;
+ //color = color * (1-fog) + ambient*fog;
+ //color *= 0.8;
+
+
+ // SHADOWS -------------------------------
+ // compute light ray vector in texture space
+
+ float4 tangent = tex2D(worldTex, uv1.xy);
+ float4 binormal = dot(tangent, normal);
+
+ float depth = 4.0;
+ float4 scale= float4(tangent.w, binormal.w, depth, 1.0);
+ float light_depth_bias=(2*lightPos.z-lightPos.z*lightPos.z);
+ lightPos.xy*=light_depth_bias;
+ lightPos.z=-lightPos.z;
+ lightPos*=scale.z/(scale*lightPos.z);
+
+ //compute light ray entry point in texture space
+ float3 lp=uv2-lightPos.xyz*uv2.z;
+ //ray_intersect_rm_linear(normTex,lp,lightPos);
+
+
+ const int linear_search_steps=3;
+
+ lightPos/=linear_search_steps;
+
+ for( int i=0;i<linear_search_steps-1;i++ ) {
+
+ float4 t=tex2D(worldTex,lp.xy);
+ if (lp.z<t.w)
+ lp+=lightPos;
+ }
+
+
+ if (lp.z<uv2.z-0.05) // if pixel in shadow
+ {
+ color*=0.25;
+ }
+ // ------------------------------------
+
+ }
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material
===================================================================
--- trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material (rev 0)
+++ trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,101 @@
+vertex_program OverhangTerrain_vp_linear cg
+{
+ source OverhangTerrainSceneManager.cg
+ entry_point OverhangTerrain_vp_linear_triplanar_cg
+// entry_point OverhangTerrain_vp_linear_cg
+ profiles vs_2_0 arbvp1
+ default_params
+ {
+ param_named_auto worldViewProj worldviewproj_matrix
+ param_named_auto world world_matrix
+ }
+}
+
+fragment_program OverhangTerrain_fp cg
+{
+ source OverhangTerrainSceneManager.cg
+ entry_point OverhangTerrain_fp_triplanar_cg
+// entry_point OverhangTerrain_fp_cg
+ profiles ps_2_0 arbfp1
+}
+
+material OverhangTerrain_simple
+{
+ technique
+ {
+ pass
+ {
+ vertex_program_ref OverhangTerrain_vp_linear
+ {
+ }
+ fragment_program_ref OverhangTerrain_fp
+ {
+ }
+
+ texture_unit worldTex
+ {
+ texture terrain_texture.jpg
+ }
+ texture_unit detailTex
+ {
+// texture terrain_detail.jpg
+// texture terr_dirt-grass.jpg
+ texture grass_1024.jpg
+ }
+ texture_unit rock
+ {
+ texture terr_rock6.jpg
+ }
+ }
+ }
+}
+
+
+material Transparent
+{
+ technique
+ {
+ colour_write_off
+ }
+}
+
+material Transparent1
+{
+ technique
+ {
+ pass
+ {
+ ambient 0.2 0.2 0.3
+ diffuse 0.2 0.2 0.2
+ scene_blend modulate
+ depth_write off
+
+ }
+ }
+}
+
+material Transparent2
+{
+ technique
+ {
+ pass
+ {
+ ambient 0.9 0.9 1.0
+ diffuse 0.9 0.9 1.0
+ scene_blend modulate
+ depth_write off
+
+// texture_unit
+// {
+// texture Water01.jpg
+// scroll_anim 0.25 0
+// }
+
+// texture_unit
+// {
+// texture Water01.jpg
+// wave_xform scroll_y sine 0 0.1 0 0.5
+// }
+ }
+ }
+}
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material.bak
===================================================================
--- trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material.bak (rev 0)
+++ trunk/python-ogre/demos/showcase_01/media/Triplanar/OverhangTerrainSceneManager.material.bak 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,118 @@
+vertex_program OverhangTerrain_vp_linear cg
+{
+ source OverhangTerrainSceneManager.cg
+ entry_point OverhangTerrain_vp_linear_triplanar_cg
+ profiles vs_2_0 arbvp1
+ default_params
+ {
+ param_named_auto worldViewProj worldviewproj_matrix
+ param_named_auto world world_matrix
+ param_named_auto ambient ambient_light_colour
+ param_named_auto lightDiffuseColour light_diffuse_colour 0
+ param_named_auto lightPos light_position 0
+ }
+}
+
+fragment_program OverhangTerrain_fp cg
+{
+ source OverhangTerrainSceneManager.cg
+ entry_point OverhangTerrain_fp_triplanar_cg
+ profiles ps_2_0 arbfp1
+ default_params
+ {
+ param_named_auto ambient ambient_light_colour
+ param_named_auto lightDiffuseColour light_diffuse_colour 0
+ param_named_auto lightPos light_position 0
+ }
+}
+
+
+
+
+
+material OverhangTerrain_simple
+{
+ technique
+ {
+ pass
+ {
+ vertex_program_ref OverhangTerrain_vp_linear
+ {
+ }
+ fragment_program_ref OverhangTerrain_fp
+ {
+ }
+
+ texture_unit worldTex
+ {
+ texture terrain_texture.jpg
+ }
+ texture_unit detailTex
+ {
+// texture terrain_detail.jpg
+// texture terr_dirt-grass.jpg
+ texture grass_1024.jpg
+ }
+ texture_unit rock
+ {
+ texture terr_rock6.jpg
+ }
+// texture_unit worldNorm
+// {
+// texture normal_terrain.png
+// }
+
+ }
+
+ }
+}
+
+
+material Transparent
+{
+ technique
+ {
+ colour_write_off
+ }
+}
+
+material Transparent1
+{
+ technique
+ {
+ pass
+ {
+ ambient 0.2 0.2 0.3
+ diffuse 0.2 0.2 0.2
+ scene_blend modulate
+ depth_write off
+
+ }
+ }
+}
+
+material Transparent2
+{
+ technique
+ {
+ pass
+ {
+ ambient 0.9 0.9 1.0
+ diffuse 0.9 0.9 1.0
+ scene_blend modulate
+ depth_write off
+
+// texture_unit
+// {
+// texture Water01.jpg
+// scroll_anim 0.25 0
+// }
+
+// texture_unit
+// {
+// texture Water01.jpg
+// wave_xform scroll_y sine 0 0.1 0 0.5
+// }
+ }
+ }
+}
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/TerrainShadows.cg
===================================================================
--- trunk/python-ogre/demos/showcase_01/media/Triplanar/TerrainShadows.cg (rev 0)
+++ trunk/python-ogre/demos/showcase_01/media/Triplanar/TerrainShadows.cg 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,42 @@
+void ray_intersect_rm_linear(
+ in sampler2D reliefmap,
+ inout float3 p,
+ inout float3 v)
+{
+
+ const int linear_search_steps=20;
+
+ const int linear_search_steps=10;
+
+
+ v/=linear_search_steps;
+
+ for( int i=0;i<linear_search_steps-1;i++ )
+ {
+ float4 t=tex2D(reliefmap,p.xy);
+ if (p.z<t.w)
+ p+=v;
+ }
+}
+
+void ray_intersect_rm_binary(
+ in sampler2D reliefmap,
+ inout float3 p,
+ inout float3 v)
+{
+ const int binary_search_steps=6;
+
+ for( int i=0;i<binary_search_steps;i++ )
+ {
+ v*=0.5;
+ float4 t=tex2D(reliefmap,p.xy);
+ if (p.z<t.w)
+ p+=2*v;
+ p-=v;
+ }
+}
+
+
+void TerrainShadow_fp (
+
+ uniform sampler2D rmtex:TEXUNIT0, // rm texture map
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/TerrainShadows.cg.bak
===================================================================
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/Thumbs.db
===================================================================
(Binary files differ)
Property changes on: trunk/python-ogre/demos/showcase_01/media/Triplanar/Thumbs.db
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/python-ogre/demos/showcase_01/media/Triplanar/fp0.frag
===================================================================
--- trunk/python-ogre/demos/showcase_01/media/Triplanar/fp0.frag (rev 0)
+++ trunk/python-ogre/demos/showcase_01/media/Triplanar/fp0.frag 2007-10-23 00:32:24 UTC (rev 453)
@@ -0,0 +1,90 @@
+void OverhangTerrain_fp_triplanar_cg (
+ float2 uv1 : TEXCOORD0,
+ float2 uv2 : TEXCOORD1,
+ float3 normal : TEXCOORD2,
+ float fog : TEXCOORD3,
+
+ // shadows
+ //float4 tangent : TEXCOORD1,
+ //float4 binormal : TEXCOORD2,
+ //
+
+ out float4 color : COLOR,
+
+ uniform float4 lightPos,
+ uniform float4 ambient,
+ uniform float4 lightDiffuseColour,
+
+ uniform sampler2D worldTex : register(s0),
+ uniform sampler2D detailTex : register(s1),
+ uniform sampler2D rock : register(s2)
+ //uniform sampler2D normTex: register(s3)
+ )
+ {
+ //taken from Cascades DX10 demo.
+ float3 blendWeights = normalize(normal);
+ blendWeights = abs(blendWeights);
+ blendWeights *= float3(7,7,7);
+ blendWeights = pow(blendWeights, float3(3,3,3));...
[truncated message content] |