Massive sunshine/viewer-dev catchup. Further implemented serverside baking and added/updated metrics feedback.
This commit is contained in:
@@ -4830,237 +4830,6 @@ BOOL equalTriangle(const S32 *a, const S32 *b)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices,
|
||||
const std::vector<Point>& input_vertices,
|
||||
const S32 num_input_triangles,
|
||||
S32 *input_triangles,
|
||||
S32 &num_output_vertices,
|
||||
LLVector3 **output_vertices,
|
||||
S32 &num_output_triangles,
|
||||
S32 **output_triangles)
|
||||
{
|
||||
LLMemType m1(LLMemType::MTYPE_VOLUME);
|
||||
|
||||
/* Testing: avoid any cleanup
|
||||
static BOOL skip_cleanup = TRUE;
|
||||
if ( skip_cleanup )
|
||||
{
|
||||
num_output_vertices = num_input_vertices;
|
||||
num_output_triangles = num_input_triangles;
|
||||
|
||||
*output_vertices = new LLVector3[num_input_vertices];
|
||||
for (S32 index = 0; index < num_input_vertices; index++)
|
||||
{
|
||||
(*output_vertices)[index] = input_vertices[index].mPos;
|
||||
}
|
||||
|
||||
*output_triangles = new S32[num_input_triangles*3];
|
||||
memcpy(*output_triangles, input_triangles, 3*num_input_triangles*sizeof(S32)); // Flawfinder: ignore
|
||||
return TRUE;
|
||||
}
|
||||
*/
|
||||
|
||||
// Here's how we do this:
|
||||
// Create a structure which contains the original vertex index and the
|
||||
// LLVector3 data.
|
||||
// "Sort" the data by the vectors
|
||||
// Create an array the size of the old vertex list, with a mapping of
|
||||
// old indices to new indices.
|
||||
// Go through triangles, shift so the lowest index is first
|
||||
// Sort triangles by first index
|
||||
// Remove duplicate triangles
|
||||
// Allocate and pack new triangle data.
|
||||
|
||||
//LLTimer cleanupTimer;
|
||||
//llinfos << "In vertices: " << num_input_vertices << llendl;
|
||||
//llinfos << "In triangles: " << num_input_triangles << llendl;
|
||||
|
||||
S32 i;
|
||||
typedef std::multiset<LLVertexIndexPair*, lessVertex> vertex_set_t;
|
||||
vertex_set_t vertex_list;
|
||||
|
||||
LLVertexIndexPair *pairp = NULL;
|
||||
for (i = 0; i < num_input_vertices; i++)
|
||||
{
|
||||
LLVertexIndexPair *new_pairp = new LLVertexIndexPair(input_vertices[i].mPos, i);
|
||||
vertex_list.insert(new_pairp);
|
||||
}
|
||||
|
||||
// Generate the vertex mapping and the list of vertices without
|
||||
// duplicates. This will crash if there are no vertices.
|
||||
llassert(num_input_vertices > 0); // check for no vertices!
|
||||
S32 *vertex_mapping = new S32[num_input_vertices];
|
||||
LLVector3 *new_vertices = new LLVector3[num_input_vertices];
|
||||
LLVertexIndexPair *prev_pairp = NULL;
|
||||
|
||||
S32 new_num_vertices;
|
||||
|
||||
new_num_vertices = 0;
|
||||
for (vertex_set_t::iterator iter = vertex_list.begin(),
|
||||
end = vertex_list.end();
|
||||
iter != end; iter++)
|
||||
{
|
||||
pairp = *iter;
|
||||
if (!prev_pairp || ((pairp->mVertex - prev_pairp->mVertex).magVecSquared() >= VERTEX_SLOP_SQRD))
|
||||
{
|
||||
new_vertices[new_num_vertices] = pairp->mVertex;
|
||||
//llinfos << "Added vertex " << new_num_vertices << " : " << pairp->mVertex << llendl;
|
||||
new_num_vertices++;
|
||||
// Update the previous
|
||||
prev_pairp = pairp;
|
||||
}
|
||||
else
|
||||
{
|
||||
//llinfos << "Removed duplicate vertex " << pairp->mVertex << ", distance magVecSquared() is " << (pairp->mVertex - prev_pairp->mVertex).magVecSquared() << llendl;
|
||||
}
|
||||
vertex_mapping[pairp->mIndex] = new_num_vertices - 1;
|
||||
}
|
||||
|
||||
// Iterate through triangles and remove degenerates, re-ordering vertices
|
||||
// along the way.
|
||||
S32 *new_triangles = new S32[num_input_triangles * 3];
|
||||
S32 new_num_triangles = 0;
|
||||
|
||||
for (i = 0; i < num_input_triangles; i++)
|
||||
{
|
||||
S32 v1 = i*3;
|
||||
S32 v2 = v1 + 1;
|
||||
S32 v3 = v1 + 2;
|
||||
|
||||
//llinfos << "Checking triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl;
|
||||
input_triangles[v1] = vertex_mapping[input_triangles[v1]];
|
||||
input_triangles[v2] = vertex_mapping[input_triangles[v2]];
|
||||
input_triangles[v3] = vertex_mapping[input_triangles[v3]];
|
||||
|
||||
if ((input_triangles[v1] == input_triangles[v2])
|
||||
|| (input_triangles[v1] == input_triangles[v3])
|
||||
|| (input_triangles[v2] == input_triangles[v3]))
|
||||
{
|
||||
//llinfos << "Removing degenerate triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl;
|
||||
// Degenerate triangle, skip
|
||||
continue;
|
||||
}
|
||||
|
||||
if (input_triangles[v1] < input_triangles[v2])
|
||||
{
|
||||
if (input_triangles[v1] < input_triangles[v3])
|
||||
{
|
||||
// (0 < 1) && (0 < 2)
|
||||
new_triangles[new_num_triangles*3] = input_triangles[v1];
|
||||
new_triangles[new_num_triangles*3+1] = input_triangles[v2];
|
||||
new_triangles[new_num_triangles*3+2] = input_triangles[v3];
|
||||
}
|
||||
else
|
||||
{
|
||||
// (0 < 1) && (2 < 0)
|
||||
new_triangles[new_num_triangles*3] = input_triangles[v3];
|
||||
new_triangles[new_num_triangles*3+1] = input_triangles[v1];
|
||||
new_triangles[new_num_triangles*3+2] = input_triangles[v2];
|
||||
}
|
||||
}
|
||||
else if (input_triangles[v2] < input_triangles[v3])
|
||||
{
|
||||
// (1 < 0) && (1 < 2)
|
||||
new_triangles[new_num_triangles*3] = input_triangles[v2];
|
||||
new_triangles[new_num_triangles*3+1] = input_triangles[v3];
|
||||
new_triangles[new_num_triangles*3+2] = input_triangles[v1];
|
||||
}
|
||||
else
|
||||
{
|
||||
// (1 < 0) && (2 < 1)
|
||||
new_triangles[new_num_triangles*3] = input_triangles[v3];
|
||||
new_triangles[new_num_triangles*3+1] = input_triangles[v1];
|
||||
new_triangles[new_num_triangles*3+2] = input_triangles[v2];
|
||||
}
|
||||
new_num_triangles++;
|
||||
}
|
||||
|
||||
if (new_num_triangles == 0)
|
||||
{
|
||||
llwarns << "Created volume object with 0 faces." << llendl;
|
||||
delete[] new_triangles;
|
||||
delete[] vertex_mapping;
|
||||
delete[] new_vertices;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
typedef std::set<S32*, lessTriangle> triangle_set_t;
|
||||
triangle_set_t triangle_list;
|
||||
|
||||
for (i = 0; i < new_num_triangles; i++)
|
||||
{
|
||||
triangle_list.insert(&new_triangles[i*3]);
|
||||
}
|
||||
|
||||
// Sort through the triangle list, and delete duplicates
|
||||
|
||||
S32 *prevp = NULL;
|
||||
S32 *curp = NULL;
|
||||
|
||||
S32 *sorted_tris = new S32[new_num_triangles*3];
|
||||
S32 cur_tri = 0;
|
||||
for (triangle_set_t::iterator iter = triangle_list.begin(),
|
||||
end = triangle_list.end();
|
||||
iter != end; iter++)
|
||||
{
|
||||
curp = *iter;
|
||||
if (!prevp || !equalTriangle(prevp, curp))
|
||||
{
|
||||
//llinfos << "Added triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl;
|
||||
sorted_tris[cur_tri*3] = *curp;
|
||||
sorted_tris[cur_tri*3+1] = *(curp+1);
|
||||
sorted_tris[cur_tri*3+2] = *(curp+2);
|
||||
cur_tri++;
|
||||
prevp = curp;
|
||||
}
|
||||
else
|
||||
{
|
||||
//llinfos << "Skipped triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
*output_vertices = new LLVector3[new_num_vertices];
|
||||
num_output_vertices = new_num_vertices;
|
||||
for (i = 0; i < new_num_vertices; i++)
|
||||
{
|
||||
(*output_vertices)[i] = new_vertices[i];
|
||||
}
|
||||
|
||||
*output_triangles = new S32[cur_tri*3];
|
||||
num_output_triangles = cur_tri;
|
||||
memcpy(*output_triangles, sorted_tris, 3*cur_tri*sizeof(S32)); /* Flawfinder: ignore */
|
||||
|
||||
/*
|
||||
llinfos << "Out vertices: " << num_output_vertices << llendl;
|
||||
llinfos << "Out triangles: " << num_output_triangles << llendl;
|
||||
for (i = 0; i < num_output_vertices; i++)
|
||||
{
|
||||
llinfos << i << ":" << (*output_vertices)[i] << llendl;
|
||||
}
|
||||
for (i = 0; i < num_output_triangles; i++)
|
||||
{
|
||||
llinfos << i << ":" << (*output_triangles)[i*3] << ":" << (*output_triangles)[i*3+1] << ":" << (*output_triangles)[i*3+2] << llendl;
|
||||
}
|
||||
*/
|
||||
|
||||
//llinfos << "Out vertices: " << num_output_vertices << llendl;
|
||||
//llinfos << "Out triangles: " << num_output_triangles << llendl;
|
||||
delete[] vertex_mapping;
|
||||
vertex_mapping = NULL;
|
||||
delete[] new_vertices;
|
||||
new_vertices = NULL;
|
||||
delete[] new_triangles;
|
||||
new_triangles = NULL;
|
||||
delete[] sorted_tris;
|
||||
sorted_tris = NULL;
|
||||
triangle_list.clear();
|
||||
std::for_each(vertex_list.begin(), vertex_list.end(), DeletePointer());
|
||||
vertex_list.clear();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLVolumeParams::importFile(LLFILE *fp)
|
||||
{
|
||||
LLMemType m1(LLMemType::MTYPE_VOLUME);
|
||||
@@ -6385,12 +6154,7 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
|
||||
S32 max_t = volume->getPath().mPath.size();
|
||||
|
||||
// S32 i;
|
||||
S32 num_vertices = 0, num_indices = 0;
|
||||
S32 grid_size = (profile.size()-1)/4;
|
||||
S32 quad_count = (grid_size * grid_size);
|
||||
|
||||
num_vertices = (grid_size+1)*(grid_size+1);
|
||||
num_indices = quad_count * 4;
|
||||
|
||||
LLVector4a& min = mExtents[0];
|
||||
LLVector4a& max = mExtents[1];
|
||||
|
||||
Reference in New Issue
Block a user