[Python-ogre-commit] SF.net SVN: python-ogre: [453] trunk/python-ogre
Brought to you by:
andy_miller,
roman_yakovenko
From: <and...@us...> - 2007-10-23 00:32:21
|
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] |