From 09778a8eabf592a02b271dc2f59b691cbdd1364e Mon Sep 17 00:00:00 2001 From: timoore Date: Thu, 7 Feb 2008 23:01:16 +0000 Subject: [PATCH] Minor cleanup of Stuart Buchanan's tree patch. Separate random objects and random trees for real. --- simgear/scene/tgdb/ShaderGeometry.cxx | 1 - simgear/scene/tgdb/TreeBin.cxx | 6 +-- simgear/scene/tgdb/obj.cxx | 74 +++++++++++++------------- simgear/scene/util/RenderConstants.hxx | 4 +- 4 files changed, 41 insertions(+), 44 deletions(-) diff --git a/simgear/scene/tgdb/ShaderGeometry.cxx b/simgear/scene/tgdb/ShaderGeometry.cxx index 8691f3d0..a6a7c1ed 100644 --- a/simgear/scene/tgdb/ShaderGeometry.cxx +++ b/simgear/scene/tgdb/ShaderGeometry.cxx @@ -22,7 +22,6 @@ #include #include #include -#include #include "ShaderGeometry.hxx" diff --git a/simgear/scene/tgdb/TreeBin.cxx b/simgear/scene/tgdb/TreeBin.cxx index 431e31aa..fae266db 100644 --- a/simgear/scene/tgdb/TreeBin.cxx +++ b/simgear/scene/tgdb/TreeBin.cxx @@ -133,7 +133,7 @@ osg::Geometry* createOrthQuads(float w, float h, int varieties, const osg::Matri "\n" "void main(void)\n" "{\n" - " texcoord = gl_MultiTexCoord0.st + vec2(textureIndex, 0.0);\n" + " texcoord = gl_MultiTexCoord0.st + vec2(textureIndex, 0.0);\n" " vec3 position = gl_Vertex.xyz * gl_Color.w + gl_Color.xyz;\n" " gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);\n" " vec3 ecPosition = vec3(gl_ModelViewMatrix * vec4(position, 1.0));\n" @@ -261,9 +261,9 @@ osg::Group* createForest(TreeBin& forest, const osg::Matrix& transform) // Don´t track vertex color material->setColorMode(Material::OFF); material->setAmbient(Material::FRONT_AND_BACK, - Vec4(.6f, .6f, .6f, 1.0f)); + Vec4(.8f, .8f, .8f, 1.0f)); material->setDiffuse(Material::FRONT_AND_BACK, - Vec4(.4f, .4f, .4f, 1.0f)); + Vec4(.2f, .2f, .2f, 1.0f)); } stateset->setAttributeAndModes(alphaFunc.get()); stateset->setAttribute(program.get()); diff --git a/simgear/scene/tgdb/obj.cxx b/simgear/scene/tgdb/obj.cxx index 06ec24fc..63ce70ea 100644 --- a/simgear/scene/tgdb/obj.cxx +++ b/simgear/scene/tgdb/obj.cxx @@ -592,7 +592,7 @@ SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool if (node) terrainGroup->addChild(node); - if (use_random_objects) { + if (use_random_objects || use_random_vegetation) { // Simple matrix for used for flipping models that have been oriented // with the center of the tile but upside down. @@ -608,49 +608,47 @@ SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool osg::Matrix mAtt = flip * osg::Matrix::rotate(hlOr.osg()); // The inverse goes from world coordinates to Z up tile coordinates. osg::Matrix world2Tile(osg::Matrix(hlOr.osg().conj()) * flip); - - tileGeometryBin.computeRandomObjects(matlib); + + if (use_random_objects) { + tileGeometryBin.computeRandomObjects(matlib); - if (tileGeometryBin.randomModels.getNumModels() > 0) { - // Generate a repeatable random seed - mt seed; - mt_init(&seed, unsigned(123)); - - std::vector models; - for (unsigned int i = 0; i < tileGeometryBin.randomModels.getNumModels(); i++) { - SGMatModelBin::MatModel obj = tileGeometryBin.randomModels.getMatModel(i); - osg::Node* node = sgGetRandomModel(obj.model); + if (tileGeometryBin.randomModels.getNumModels() > 0) { + // Generate a repeatable random seed + mt seed; + mt_init(&seed, unsigned(123)); + + std::vector models; + for (unsigned int i = 0; + i < tileGeometryBin.randomModels.getNumModels(); i++) { + SGMatModelBin::MatModel obj + = tileGeometryBin.randomModels.getMatModel(i); + osg::Node* node = sgGetRandomModel(obj.model); - // Create a matrix to place the object in the correct location, and then - // apply the rotation matrix created above, with an additional random - // heading rotation if appropriate. - osg::Matrix mPos = osg::Matrix::translate(obj.position.osg()); - osg::MatrixTransform* position; - - if (obj.model->get_heading_type() == SGMatModel::HEADING_RANDOM) { - // Rotate the object around the z axis. - double hdg = mt_rand(&seed) * M_PI * 2; - osg::Matrix rot(cos(hdg), -sin(hdg), 0, 0, - sin(hdg), cos(hdg), 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1); - position = new osg::MatrixTransform(rot * mAtt * mPos); - } else { - position = new osg::MatrixTransform(mAtt * mPos); + // Create a matrix to place the object in the correct + // location, and then apply the rotation matrix created + // above, with an additional random heading rotation if appropriate. + osg::Matrix transformMat(mAtt); + transformMat.postMult(osg::Matrix::translate(obj.position.osg())); + if (obj.model->get_heading_type() == SGMatModel::HEADING_RANDOM) { + // Rotate the object around the z axis. + double hdg = mt_rand(&seed) * M_PI * 2; + transformMat.preMult(osg::Matrix::rotate(hdg, + osg::Vec3d(0.0, 0.0, 1.0))); + } + osg::MatrixTransform* position = + new osg::MatrixTransform(transformMat); + position->addChild(node); + models.push_back(ModelLOD(position, obj.lod)); } - - position->addChild(node); - models.push_back(ModelLOD(position, obj.lod)); + RandomObjectsQuadtree quadtree((GetModelLODCoord(world2Tile)), + (AddModelLOD())); + quadtree.buildQuadTree(models.begin(), models.end()); + randomObjects = quadtree.getRoot(); + randomObjects->setName("random objects"); } - RandomObjectsQuadtree quadtree((GetModelLODCoord(world2Tile)), - (AddModelLOD())); - quadtree.buildQuadTree(models.begin(), models.end()); - randomObjects = quadtree.getRoot(); - randomObjects->setName("random objects"); } - if (use_random_vegetation) - { + if (use_random_vegetation) { // Now add some random forest. tileGeometryBin.computeRandomForest(matlib); diff --git a/simgear/scene/util/RenderConstants.hxx b/simgear/scene/util/RenderConstants.hxx index 184b9abc..477e4162 100644 --- a/simgear/scene/util/RenderConstants.hxx +++ b/simgear/scene/util/RenderConstants.hxx @@ -51,8 +51,8 @@ enum NodeMask { // Normal opaque objects are assigned bin 0. // // Random objects like trees may have transparency, but there are too -// many to depth sort. By drawing them after the terrain we can at -// least keep the sky under the ground from poking through. +// many to depth sort individually. By drawing them after the terrain +// we can at least keep the sky under the ground from poking through. // // Point lights blend with the terrain to simulate attenuation but // should completely obscure any transparent geometry behind -- 2.39.5