]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/patch.cpp
also support XactCone and XactSphere
[xonotic/netradiant.git] / radiant / patch.cpp
index 221d333350b3326d504fdb3eae31e5accc25b938..9ecb64990d74db7cd612d452811f16741660060d 100644 (file)
@@ -1413,9 +1413,9 @@ void Patch::ConstructPrefab(const AABB& aabb, EPatchPrefab eType, int axis, std:
        float f = 1 / cos(M_PI / n);
        for(i = 0; i < 2*n+1; ++i)
        {
-               float angle  = (M_PI * i) / n;
-               float x = vPos[1][0] + cos(angle) * (vPos[2][0] - vPos[1][0]) * ((i&1) ? f : 1.0f);
-               float y = vPos[1][1] + sin(angle) * (vPos[2][1] - vPos[1][1]) * ((i&1) ? f : 1.0f);
+               float angle = (M_PI * i) / n;
+               float x = vPos[1][0] + (vPos[2][0] - vPos[1][0]) * cos(angle) * ((i&1) ? f : 1.0f);
+               float y = vPos[1][1] + (vPos[2][1] - vPos[1][1]) * sin(angle) * ((i&1) ? f : 1.0f);
                for(j = 0; j < 3; ++j)
                {
                        float z = vPos[j][2];
@@ -1427,6 +1427,63 @@ void Patch::ConstructPrefab(const AABB& aabb, EPatchPrefab eType, int axis, std:
                }
        }
   }
+  else if (eType == eXactCone)
+  {
+       int n = 6; // n = number of segments
+       setDims(2 * n + 1, 3);
+
+       // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents);
+       // vPos[1] = aabb.origin;
+       // vPos[2] = vector3_added(aabb.origin, aabb.extents);
+
+       int i, j;
+       float f = 1 / cos(M_PI / n);
+       for(i = 0; i < 2*n+1; ++i)
+       {
+               float angle = (M_PI * i) / n;
+               for(j = 0; j < 3; ++j)
+               {
+                       float x = vPos[1][0] + ((2-j)/2.0f) * (vPos[2][0] - vPos[1][0]) * cos(angle) * ((i&1) ? f : 1.0f);
+                       float y = vPos[1][1] + ((2-j)/2.0f) * (vPos[2][1] - vPos[1][1]) * sin(angle) * ((i&1) ? f : 1.0f);
+                       float z = vPos[j][2];
+                       PatchControl *v;
+                       v = &m_ctrl.data()[j*(2*n+1)+i];
+                       v->m_vertex[0] = x;
+                       v->m_vertex[1] = y;
+                       v->m_vertex[2] = z;
+               }
+       }
+  }
+  else if (eType == eXactSphere)
+  {
+       int n = 6; // n = number of segments
+       int m = 3; // m = number of segments
+       setDims(2 * n + 1, 2 * m + 1);
+
+       // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents);
+       // vPos[1] = aabb.origin;
+       // vPos[2] = vector3_added(aabb.origin, aabb.extents);
+
+       int i, j;
+       float f = 1 / cos(M_PI / n);
+       float g = 1 / cos(M_PI / (2*m));
+       for(i = 0; i < 2*n+1; ++i)
+       {
+               float angle = (M_PI * i) / n;
+               for(j = 0; j < 2*m+1; ++j)
+               {
+                       float angle2 = (M_PI * j) / (2*m);
+                       float x = vPos[1][0] + (vPos[2][0] - vPos[1][0]) *  sin(angle2) * ((j&1) ? g : 1.0f) * cos(angle) * ((i&1) ? f : 1.0f);
+                       float y = vPos[1][1] + (vPos[2][1] - vPos[1][1]) *  sin(angle2) * ((j&1) ? g : 1.0f) * sin(angle) * ((i&1) ? f : 1.0f);
+                       float z = vPos[1][2] + (vPos[2][2] - vPos[1][2]) * -cos(angle2) * ((j&1) ? g : 1.0f);
+                       PatchControl *v;
+                       v = &m_ctrl.data()[j*(2*n+1)+i];
+                       v->m_vertex[0] = x;
+                       v->m_vertex[1] = y;
+                       v->m_vertex[2] = z;
+               }
+       }
+  }
   else if  (eType == eBevel)
   {
     unsigned char *pIndex;