]> git.mxchange.org Git - simgear.git/commitdiff
Harald JOHNSEN:
authorehofman <ehofman>
Sun, 31 Jul 2005 08:56:27 +0000 (08:56 +0000)
committerehofman <ehofman>
Sun, 31 Jul 2005 08:56:27 +0000 (08:56 +0000)
added a cull test on fields

simgear/scene/sky/cloudfield.cxx
simgear/scene/sky/cloudfield.hxx

index 37ff89107a27fe3ea0ea669c0f9d09afc97f09b6..d9608de6514b3d46d545ac33575e9681f2e9a99f 100644 (file)
@@ -249,17 +249,26 @@ static int densTable[][10] = {
 void SGCloudField::applyDensity(void) {
        int row = (int) (density / 10.0);
        int col = 0;
+    sgBox fieldBox;
+
        list_of_Cloud::iterator iCloud;
        for( iCloud = theField.begin() ; iCloud != theField.end() ; iCloud++ ) {
                if(++col > 9)
                        col = 0;
                if( densTable[row][col] ) {
                        iCloud->visible = true;
+            fieldBox.extend( *iCloud->aCloud->getCenter() );
                } else
                        iCloud->visible = false;
        }
        last_density = density;
        draw_in_3d = ( theField.size() != 0);
+    sgVec3 center;
+    sgSubVec3( center, fieldBox.getMax(), fieldBox.getMin() );
+    sgScaleVec3( center, 0.5f );
+    center[1] = 0.0f;
+    field_sphere.setCenter( center );
+    field_sphere.setRadius( fieldSize * 0.5f * 1.414f );
 }
 
 // add one cloud, data is not copied, ownership given
@@ -298,7 +307,15 @@ void SGCloudField::buildTestLayer(void) {
 void SGCloudField::cullClouds(sgVec3 eyePos, sgMat4 mat) {
        list_of_Cloud::iterator iCloud;
 
-       // TODO:cull the field before culling the clouds in the field (should eliminate 3 fields)
+    sgSphere tile_sphere;
+    tile_sphere.setRadius( field_sphere.getRadius() );
+    sgVec3 tile_center;
+    sgSubVec3( tile_center, field_sphere.getCenter(), eyePos );
+    tile_sphere.setCenter( tile_center );
+    tile_sphere.orthoXform(mat);
+    if( frustum.contains( & tile_sphere ) == SG_OUTSIDE )
+        return;
+
        for( iCloud = theField.begin() ; iCloud != theField.end() ; iCloud++ ) {
                sgVec3 dist;
                sgSphere sphere;
index 703b17a1ea96ddcc3a65f8adfcadb7fd4fe42caf..cb9968ddc9ade58cbb46562e32689d371d3d7196 100644 (file)
@@ -76,7 +76,7 @@ private:
        sgMat4 transform;
        double deltax, deltay, alt;
     double last_lon, last_lat, last_course;
-
+    sgSphere field_sphere;
        float   last_density;
        bool    draw_in_3d;