]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
Point Frustum funktioniert
authorPeter Schaefer <schaeferpm@gmail.com>
Wed, 18 May 2016 15:32:01 +0000 (17:32 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Wed, 18 May 2016 15:32:01 +0000 (17:32 +0200)
Weave/Scene/Camera.cpp
Weave/Scene/Camera.h
Weave/Scene/Scene.cpp

index 93e122ac023067612260a0f03cf631e11b817e58..ed8321182c4f919b13aa74d22519246b8c2eec40 100644 (file)
@@ -111,14 +111,27 @@ void Camera::updateProjection(float _yFov, float _xyRatio, float _zNear, float _
        projection = perspective(yFov, xyRatio, zNear, zFar);
 }
 
-Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius)
+Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius) const
 {
+
+       FC_stat result = FC_INSIDE;
+
        vec3 v(_center - cCenter);
        vec3 pVCam(dot(v,cRight), dot(v,cUpVector), dot(v,cFront));
 
-       if (_radius != 0) {
+       float h2 = pVCam.z * tan(yFov/2);
+       float w2 = h2 * xyRatio;
+       //float d = _radius * cos
+
+       if (_radius == 0) {
                if (pVCam.z > zFar || pVCam.z < zNear)
                        return FC_OUTSIDE;
+
+               if (pVCam.y > h2 || pVCam.y < -h2)
+                       return FC_OUTSIDE;
+
+               if (pVCam.x > w2 || pVCam.x < -w2)
+                       return FC_OUTSIDE;
        }
        else
        {
@@ -126,11 +139,11 @@ Camera::FC_stat Camera::frustum_sphere(vec3 _center, float _radius)
                        return FC_OUTSIDE;
 
                if (pVCam.z > zFar - _radius || pVCam.z < zNear + _radius)
-                       return FC_INTERSECT;
+                       result = FC_INTERSECT;
        }
 
 
-       return FC_INSIDE;
+       return result;
 }
 
 void Camera::updateVectors()
index 6b17db86e8450bb5664217742567dc6d54664b1f..9e0fe5d8e06ed0f37d42c3c0fdb11541d8e1814c 100644 (file)
@@ -37,7 +37,7 @@ public:
                FC_INSIDE
        };
 
-       FC_stat frustum_sphere(vec3 center, float radius = 0.f);
+       FC_stat frustum_sphere(vec3 center, float radius = 0.f) const;
 
 protected:
 
index a7b1590a68d2d074ecbb653f889279c008a5863c..9cf7aa4ddc3a06fb8bfdf53f7fd4d1261e515f5e 100644 (file)
@@ -327,7 +327,10 @@ void Scene::drawSceneObjects(drawTarget _target) const
 
        for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i)
        {
-                       (*i)->draw(_target);
+               auto result = camera.frustum_sphere((*i)->getPosition());
+               if (result == camera.FC_OUTSIDE)
+                       continue;
+               (*i)->draw(_target);
        }
 }