]> git.mxchange.org Git - simgear.git/commitdiff
Minor cleanup of Stuart Buchanan's tree patch.
authortimoore <timoore>
Thu, 7 Feb 2008 23:01:16 +0000 (23:01 +0000)
committertimoore <timoore>
Thu, 7 Feb 2008 23:01:16 +0000 (23:01 +0000)
Separate random objects and random trees for real.

simgear/scene/tgdb/ShaderGeometry.cxx
simgear/scene/tgdb/TreeBin.cxx
simgear/scene/tgdb/obj.cxx
simgear/scene/util/RenderConstants.hxx

index 8691f3d09538e0b66d2e15cf3ff0583520db8bd2..a6a7c1ed9300018b65eae93373be5c71f4159409 100644 (file)
@@ -22,7 +22,6 @@
 #include <osgDB/Registry>
 #include <osgDB/Input>
 #include <osgDB/ParameterOutput>
-#include <simgear/screen/extensions.hxx>
 
 #include "ShaderGeometry.hxx"
 
index 431e31aa8fedd002af2d6d012f0a2633b90eb77a..fae266dbb98f28201f51dba32a450c04d658bcde 100644 (file)
@@ -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());
index 06ec24fc1c74e2ec7d4947cf0e7e72def8c79f51..63ce70ea388a7501ebdb75ee4c3fb5fdcb0bbbe3 100644 (file)
@@ -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<ModelLOD> 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<ModelLOD> 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);
 
index 184b9abc9e9bc20f7db41a5c8759784979f8db37..477e41621fe9b4d7e4512ea144fd82f228ef8015 100644 (file)
@@ -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