797 lines
35 KiB
C
797 lines
35 KiB
C
|
/*
|
||
|
* MarchingTetrahedon.h
|
||
|
*
|
||
|
* Created on: 20.10.2017
|
||
|
* Author: gmueller
|
||
|
*/
|
||
|
|
||
|
#ifndef MARCHINGTETRAHEDON_H_
|
||
|
#define MARCHINGTETRAHEDON_H_
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
struct Voxel {
|
||
|
Voxel() :
|
||
|
density(rand() % 20 + 40), material(0) {
|
||
|
}
|
||
|
int density; /*1..100*/
|
||
|
int material; /*id's will be given*/
|
||
|
float x, y, z;
|
||
|
};
|
||
|
|
||
|
int width = 1366, height = 768;
|
||
|
float moving = 0;
|
||
|
float* dispArr;
|
||
|
int dispArrSize;
|
||
|
int frame = 0;
|
||
|
int i = 0, j = 0, k = 0;
|
||
|
Voxel*** field;
|
||
|
GLuint texture;
|
||
|
bool running = true;
|
||
|
|
||
|
cameraT cam(Vector3D(__MAPSIZE__ - 2, __MAPSIZE__ - 2, __MAPSIZE__ - 2),
|
||
|
Vector3D(0, 0, 0));
|
||
|
int ghostX, ghostY;
|
||
|
|
||
|
/*GL_N3F_V3F*/
|
||
|
/*[Nx][Ny][Nz][Vx][Vy][Vz]*/
|
||
|
float* vertices;
|
||
|
|
||
|
|
||
|
|
||
|
/*The coordinates, the nubered tetrahedrons and the description are in the blender file named tetrahedrons.blend*/
|
||
|
void marchingTetrahedrons(Voxel v0, Voxel v1, Voxel v2, Voxel v3, float **verts,
|
||
|
int size, int* current, int tetrahedron) {
|
||
|
/*to be precise: the verts array currently is: [vertices][coordinates] = [n][6]
|
||
|
so the size represents the number of vertices*/
|
||
|
/*first we find out how many lands are in this tetrahedron(max is 4)*/
|
||
|
int count = 0;
|
||
|
if (v0.material != 0)
|
||
|
count++;
|
||
|
if (v1.material != 0)
|
||
|
count++;
|
||
|
if (v2.material != 0)
|
||
|
count++;
|
||
|
if (v3.material != 0)
|
||
|
count++;
|
||
|
|
||
|
/*let's decide the density of each material*/
|
||
|
float v0d = 1 - (float) v0.density / 100;
|
||
|
float v1d = 1 - (float) v1.density / 100;
|
||
|
float v2d = 1 - (float) v2.density / 100;
|
||
|
float v3d = 1 - (float) v3.density / 100;
|
||
|
/*depending on the number we extract the cases*/
|
||
|
switch (count) {
|
||
|
case 0:
|
||
|
case 4:
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
/*One voxel has material*/
|
||
|
if (v0.material != 0) { /*03,02,01*/
|
||
|
if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
/*correct tetrahedrons for this winding: 1,3,4,6*/
|
||
|
/*wrong tetrahedrons for this winding: 2,5*/
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v1.material != 0) { /*01,13,12*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v2.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v2.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v2.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v1.x * v1d + v2.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v2.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v2.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v2.material != 0) { /*02,12,23*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 3 || tetrahedron == 1 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v3.material != 0) { /*03,32,31*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * v3d + v2.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v2.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v2.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * v3d + v1.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v1.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v1.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v3.x * v3d + v1.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v1.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v1.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * v3d + v2.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v2.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v2.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
/*two voxels have material*/
|
||
|
if (v0.material != 0 && v3.material != 0) { /*01,02,31;31,02,32*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * v3d + v1.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v1.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v1.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * (1 - v0d) + v0.x * v0d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v0d) + v0.y * v0d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v0d) + v0.z * v0d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * v3d + v2.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v2.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v2.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 4 || tetrahedron == 1 || tetrahedron == 3
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v3.x * v3d + v1.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v1.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v1.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v3.x * v3d + v2.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v2.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v2.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * (1 - v0d) + v0.x * v0d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v0d) + v0.y * v0d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v0d) + v0.z * v0d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v1.material != 0 && v2.material != 0) { /*13,32,02;02,01,13*/
|
||
|
if (tetrahedron == 1 || tetrahedron == 4 || tetrahedron == 6
|
||
|
|| tetrahedron == 3) {
|
||
|
/*correct tetrahedrons for this winding: 1,3,4,6*/
|
||
|
/*wrong tetrahedrons for this winding: 2,5*/
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v3.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v3.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v3.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v3.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v2.material != 0 && v3.material != 0) { /*03,02,13;13,02,12*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v0.material != 0 && v1.material != 0) { /*03,02,13;13,02,12*/
|
||
|
if (tetrahedron == 3 || tetrahedron == 6 || tetrahedron == 1
|
||
|
|| tetrahedron == 4) {
|
||
|
/*correct tetrahedrons for this winding: 1,3,4,6*/
|
||
|
/*wrong tetrahedrons for this winding: 2,5*/
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v2.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v2.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v2.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v1.x * v1d + v2.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v2.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v2.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v1.material != 0 && v3.material != 0) { /*01,12,32;32,30,01*/
|
||
|
if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
/*correct tetrahedrons for this winding: 1,3,4,6*/
|
||
|
/*wrong tetrahedrons for this winding: 2,5*/
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v2.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v2.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v2.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v2.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * v3d + v0.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v0.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v0.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
verts[(*current)][3] = (v2.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v2.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v2.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v2.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v3.x * v3d + v0.x * (1 - v3d));
|
||
|
verts[(*current)][4] = (v3.y * v3d + v0.y * (1 - v3d));
|
||
|
verts[(*current)][5] = (v3.z * v3d + v0.z * (1 - v3d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v0.material != 0 && v2.material != 0) { /*01,03,32;32,12,01*/
|
||
|
if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
/*correct tetrahedrons for this winding: 1,3,4,6*/
|
||
|
/*wrong tetrahedrons for this winding: 2,5*/
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 5 || tetrahedron == 2) {
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
/*three voxels have material*/
|
||
|
if (v0.material == 0) { /*03,01,02*/
|
||
|
if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
/*correct tetrahedrons for this winding: 1,3,4,6*/
|
||
|
/*wrong tetrahedrons for this winding: 2,5*/
|
||
|
verts[(*current)][3] = (v0.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
verts[(*current)][3] = (v0.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v0.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v0.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v1.material == 0) { /*10,12,13*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v1.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * (1 - v2d) + v2.x * v2d);
|
||
|
verts[(*current)][4] = (v1.y * (1 - v2d) + v2.y * v2d);
|
||
|
verts[(*current)][5] = (v1.z * (1 - v2d) + v2.z * v2d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v1.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v1.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v1.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v2.material == 0) { /*20,23,21*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 1 || tetrahedron == 3 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v2.x * (1 - v1d) + v1.x * v1d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v1d) + v1.y * v1d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v1d) + v1.z * v1d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * (1 - v3d) + v3.x * v3d);
|
||
|
verts[(*current)][4] = (v2.y * (1 - v3d) + v3.y * v3d);
|
||
|
verts[(*current)][5] = (v2.z * (1 - v3d) + v3.z * v3d);
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v2.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v2.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v2.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
} else if (v3.material == 0) { /*30,31,32*/
|
||
|
if (tetrahedron == 2 || tetrahedron == 5) {
|
||
|
/*correct tetrahedrons for this winding: 2,5*/
|
||
|
/*wrong tetrahedrons for this winding: 1,3,4,6*/
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
} else if (tetrahedron == 3 || tetrahedron == 1 || tetrahedron == 4
|
||
|
|| tetrahedron == 6) {
|
||
|
verts[(*current)][3] = (v2.x * v2d + v3.x * (1 - v2d));
|
||
|
verts[(*current)][4] = (v2.y * v2d + v3.y * (1 - v2d));
|
||
|
verts[(*current)][5] = (v2.z * v2d + v3.z * (1 - v2d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v1.x * v1d + v3.x * (1 - v1d));
|
||
|
verts[(*current)][4] = (v1.y * v1d + v3.y * (1 - v1d));
|
||
|
verts[(*current)][5] = (v1.z * v1d + v3.z * (1 - v1d));
|
||
|
(*current) = (*current) + 1;
|
||
|
verts[(*current)][3] = (v0.x * v0d + v3.x * (1 - v0d));
|
||
|
verts[(*current)][4] = (v0.y * v0d + v3.y * (1 - v0d));
|
||
|
verts[(*current)][5] = (v0.z * v0d + v3.z * (1 - v0d));
|
||
|
(*current) = (*current) + 1;/**/
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
float** generateVertices(Voxel*** inField, int* size) {
|
||
|
/*size means how many vertices are going to be in the array*/
|
||
|
/*testdata will be just squares, so there will be n*3*2 vertices */
|
||
|
int count = 0;
|
||
|
int current = 0;
|
||
|
float** verts;
|
||
|
float** tverts;
|
||
|
|
||
|
/*at maximum we have (roughly) __MAPSIZE__*__MAPSIZE__*__MAPSIZE__ cubes, all of which can use
|
||
|
(roughly) 6 tetrahedrons, and every tetrahedrons maximum triangle count is 2. every tringle has 3 vertices.
|
||
|
Every vertex will have 6 coordinates(3 space coordinates, 3 normal vector coordinates)
|
||
|
Considering all this, an estimated maximum we will have __MAPSIZE__*__MAPSIZE__*__MAPSIZE__*6*2*3*6.
|
||
|
That's 27000000. Holy shit.
|
||
|
Here we will use [__MAPSIZE__*__MAPSIZE__*__MAPSIZE__*6*2*3] elements as vertices, and [6] for coordinates
|
||
|
*/
|
||
|
|
||
|
/*reserve memory for the array*/
|
||
|
count = __MAPSIZE__ * __MAPSIZE__ * __MAPSIZE__ * 6 * 2 * 3;
|
||
|
tverts = new float*[count];
|
||
|
for (i = 0; i < count; i++)
|
||
|
tverts[i] = new float[6];
|
||
|
|
||
|
/*go through the field cube to cube. A cube will have an edge of 1.*/
|
||
|
for (i = 0; i < __MAPSIZE__ - 1; i++)
|
||
|
for (j = 0; j < __MAPSIZE__ - 1; j++)
|
||
|
for (k = 0; k < __MAPSIZE__ - 1; k++) {
|
||
|
/*and we call the tetrahedrons to the 8 vertices of the cube*/
|
||
|
/*!Thank you paul Burke! (work needed in the booklet)
|
||
|
PolygoniseTri(grid,iso,triangles,0,2,3,7);
|
||
|
PolygoniseTri(grid,iso,triangles,0,2,6,7);
|
||
|
PolygoniseTri(grid,iso,triangles,0,4,6,7);
|
||
|
|
||
|
PolygoniseTri(grid,iso,triangles,0,6,1,2);
|
||
|
PolygoniseTri(grid,iso,triangles,0,6,1,4);
|
||
|
PolygoniseTri(grid,iso,triangles,5,6,1,4);
|
||
|
*/
|
||
|
/*1*/marchingTetrahedrons(inField[i][j][k + 1],
|
||
|
inField[i + 1][j][k], inField[i][j][k],
|
||
|
inField[i][j + 1][k], tverts, count, ¤t, 1);/**/
|
||
|
/*2*/marchingTetrahedrons(inField[i][j][k + 1],
|
||
|
inField[i + 1][j][k], inField[i + 1][j + 1][k],
|
||
|
inField[i][j + 1][k], tverts, count, ¤t, 2);/**/
|
||
|
/*3*/marchingTetrahedrons(inField[i][j][k + 1],
|
||
|
inField[i][j + 1][k + 1], inField[i + 1][j + 1][k],
|
||
|
inField[i][j + 1][k], tverts, count, ¤t, 3);/**/
|
||
|
/*4*/marchingTetrahedrons(inField[i][j][k + 1],
|
||
|
inField[i + 1][j + 1][k], inField[i + 1][j][k + 1],
|
||
|
inField[i + 1][j][k], tverts, count, ¤t, 4);/**/
|
||
|
/*5*/marchingTetrahedrons(inField[i][j][k + 1],
|
||
|
inField[i + 1][j + 1][k], inField[i + 1][j][k + 1],
|
||
|
inField[i][j + 1][k + 1], tverts, count, ¤t, 5);/**/
|
||
|
/*6*/marchingTetrahedrons(inField[i + 1][j + 1][k + 1],
|
||
|
inField[i + 1][j + 1][k], inField[i + 1][j][k + 1],
|
||
|
inField[i][j + 1][k + 1], tverts, count, ¤t, 6);/**/
|
||
|
}
|
||
|
|
||
|
/*After the algorithm, I copy every triangle to the appropriate sized result array(verts)*/
|
||
|
verts = new float*[current];
|
||
|
for (i = 0; i < current; i++)
|
||
|
verts[i] = new float[6];
|
||
|
|
||
|
for (i = 0; i < current; i++) {
|
||
|
verts[i][3] = tverts[i][3];
|
||
|
verts[i][4] = tverts[i][4];
|
||
|
verts[i][5] = tverts[i][5];
|
||
|
}
|
||
|
|
||
|
delete[] tverts;
|
||
|
|
||
|
/*and give the algorithm the number of the vertices*/
|
||
|
(*size) = current;
|
||
|
|
||
|
return verts;
|
||
|
}
|
||
|
|
||
|
void normalizeVertices(float** inverts, int size) {
|
||
|
Vector3D tempV[3];
|
||
|
Vector3D tNormal;
|
||
|
for (i = 0; i < size; i += 3) {
|
||
|
|
||
|
tempV[0] = Vector3D(inverts[i][3], inverts[i][4], inverts[i][5]);
|
||
|
tempV[1] = Vector3D(inverts[i + 1][3], inverts[i + 1][4],
|
||
|
inverts[i + 1][5]);
|
||
|
tempV[2] = Vector3D(inverts[i + 2][3], inverts[i + 2][4],
|
||
|
inverts[i + 2][5]);
|
||
|
tNormal = calcNormal(tempV);
|
||
|
|
||
|
inverts[i][0] = tNormal.x;
|
||
|
inverts[i][1] = tNormal.y;
|
||
|
inverts[i][2] = tNormal.z;
|
||
|
|
||
|
inverts[i + 1][0] = tNormal.x;
|
||
|
inverts[i + 1][1] = tNormal.y;
|
||
|
inverts[i + 1][2] = tNormal.z;
|
||
|
|
||
|
inverts[i + 2][0] = tNormal.x;
|
||
|
inverts[i + 2][1] = tNormal.y;
|
||
|
inverts[i + 2][2] = tNormal.z;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
float* arrayizeVertices(float** inverts, int size) {
|
||
|
float* verts;
|
||
|
int count = 0;
|
||
|
|
||
|
verts = new float[size * 6];
|
||
|
|
||
|
for (i = 0; i < size; i++) {
|
||
|
verts[count] = inverts[i][0];
|
||
|
verts[count + 1] = inverts[i][1];
|
||
|
verts[count + 2] = inverts[i][2];
|
||
|
verts[count + 3] = inverts[i][3];
|
||
|
verts[count + 4] = inverts[i][4];
|
||
|
verts[count + 5] = inverts[i][5];
|
||
|
count += 6;
|
||
|
}
|
||
|
return verts;
|
||
|
}
|
||
|
|
||
|
#endif /* MARCHINGTETRAHEDON_H_ */
|