Example #1
0
 public TriangleMesh()
 {
     triangles = null;
     points = null;
     normals = uvs = new ParameterList.FloatParameter();
     faceShaders = null;
 }
Example #2
0
 public virtual bool update(ParameterList pl, SunflowAPI api)
 {
     bool updatedTopology = false;
     {
         int[] trianglesi = pl.getIntArray("triangles");
         if (trianglesi != null)
         {
             this.triangles = trianglesi;
             updatedTopology = true;
         }
     }
     if (triangles == null)
     {
         UI.printError(UI.Module.GEOM, "Unable to update mesh - triangle indices are missing");
         return false;
     }
     if (triangles.Length % 3 != 0)
         UI.printWarning(UI.Module.GEOM, "Triangle index data is not a multiple of 3 - triangles may be missing");
     pl.setFaceCount(triangles.Length / 3);
     {
         ParameterList.FloatParameter pointsP = pl.getPointArray("points");
         if (pointsP != null)
             if (pointsP.interp != ParameterList.InterpolationType.VERTEX)
                 UI.printError(UI.Module.GEOM, "Point interpolation type must be set to \"vertex\" - was \"{0}\"", pointsP.interp.ToString().ToLower());
             else
             {
                 points = pointsP.data;
                 updatedTopology = true;
             }
     }
     if (points == null)
     {
         UI.printError(UI.Module.GEOM, "Unable to update mesh - vertices are missing");
         return false;
     }
     pl.setVertexCount(points.Length / 3);
     pl.setFaceVertexCount(3 * (triangles.Length / 3));
     ParameterList.FloatParameter normals = pl.getVectorArray("normals");
     if (normals != null)
         this.normals = normals;
     ParameterList.FloatParameter uvs = pl.getTexCoordArray("uvs");
     if (uvs != null)
         this.uvs = uvs;
     int[] faceShaders = pl.getIntArray("faceshaders");
     if (faceShaders != null && faceShaders.Length == triangles.Length / 3)
     {
         this.faceShaders = new byte[faceShaders.Length];
         for (int i = 0; i < faceShaders.Length; i++)
         {
             int v = faceShaders[i];
             if (v > 255)
                 UI.printWarning(UI.Module.GEOM, "Shader index too large on triangle {0}", i);
             this.faceShaders[i] = (byte)(v & 0xFF);
         }
     }
     if (updatedTopology)
     {
         // create triangle acceleration structure
         init();
     }
     return true;
 }