-//=======================
-// NEW GEN
-//=======================
-
-void NewGen (char *ModelFile, char *OutputName, int width, int height)
-{
- trigroup_t *triangles;
- triangle_t *ptri;
- triangle_t *grouptris;
- mesh_node_t *pmnodes;
-
- vec3_t *vertices;
- vec3_t *uvs;
- vec3_t aveNorm, crossvect;
- vec3_t diffvect1, diffvect2;
- vec3_t v0, v1, v2;
- vec3_t n, u, v;
- vec3_t base, zaxis, yaxis;
- vec3_t uvwMin, uvwMax;
- vec3_t groupMin, groupMax;
- vec3_t uvw;
-
- float *uFinal, *vFinal;
- unsigned char *newpic;
-
- int finalstart = 0, finalcount = 0;
- int xbase = 0, xwidth = 0, ywidth = 0;
- int *todo, *done, finished;
- int i, j, k, l; //counters
- int groupnum, numtris, numverts, num;
- int count;
- FILE *grpfile;
- long datasize;
-
- for ( i = 0; i<3; i++)
- {
- aveNorm[i] = 0;
- uvwMin[i] = 1e30f;
- uvwMax[i] = -1e30f;
- }
-
- pmnodes = NULL;
- ptri = NULL;
- triangles = NULL;
-
- zaxis[0] = 0;
- zaxis[1] = 0;
- zaxis[2] = 1;
-
- yaxis[0] = 0;
- yaxis[1] = 1;
- yaxis[2] = 0;
-
- LoadTriangleList (ModelFile, &ptri, &fmheader.num_tris, &pmnodes, &fmheader.num_mesh_nodes);
-
- todo = (int*)SafeMalloc(fmheader.num_tris*sizeof(int), "NewGen");
- done = (int*)SafeMalloc(fmheader.num_tris*sizeof(int), "NewGen");
- triangles = (trigroup_t*)SafeMalloc(fmheader.num_tris*sizeof(trigroup_t), "NewGen");
-
- for ( i=0; i < fmheader.num_tris; i++)
- {
- todo[i] = false;
- done[i] = false;
- triangles[i].triangle = ptri[i];
- triangles[i].group = 0;
- }
-
- groupnum = 0;
-
-// transitive closure algorithm follows
-// put all triangles who transitively share vertices into separate groups
-
- while (1)
- {
- for ( i = 0; i < fmheader.num_tris; i++)
- {
- if (!done[i])
- {
- break;
- }
- }
- if ( i == fmheader.num_tris)
- {
- break;
- }
- finished = false;
- todo[i] = true;
- while (!finished)
- {
- finished = true;
- for ( i = 0; i < fmheader.num_tris; i++)
- {
- if (todo[i])
- {
- done[i] = true;
- triangles[i].group = groupnum;
- todo[i] = false;
- for ( j = 0; j < fmheader.num_tris; j++)
- {
- if ((!done[j]) && (ShareVertex(triangles[i],triangles[j])))
- {
- todo[j] = true;
- finished = false;
- }
- }
- }
- }
- }
- groupnum++;
- }
- uFinal = (float*)SafeMalloc(3*fmheader.num_tris*sizeof(float), "NewGen");
- vFinal = (float*)SafeMalloc(3*fmheader.num_tris*sizeof(float), "NewGen");
-
- grpfile = fopen("grpdebug.txt","w");
-
-
- for (i = 0; i < groupnum; i++)
- {
-
- fprintf(grpfile,"Group Number: %d\n", i);
-
- numtris = GetNumTris(triangles, i); // number of triangles in group i
- numverts = numtris * 3;
-
- fprintf(grpfile,"%d triangles.\n", numtris);
-
- vertices = (vec3_t*)SafeMalloc(numverts*sizeof(vec3_t), "NewGen");
- uvs = (vec3_t*)SafeMalloc(numverts*sizeof(vec3_t), "NewGen");
- grouptris = (triangle_t*)SafeMalloc(numtris*sizeof(triangle_t), "NewGen");
-
- for (count = 0; count < fmheader.num_tris; count++)
- {
- if (triangles[count].group == i)
- {
- fprintf(grpfile,"Triangle %d\n", count);
- }
- }
- fprintf(grpfile,"\n");
-
-
-
-
- GetOneGroup(triangles, i, grouptris);
-
- num = 0;
- for (j = 0; j < numtris; j++)
- {
- VectorCopy(grouptris[j].verts[0], v0);
- VectorCopy(grouptris[j].verts[1], v1);
- VectorCopy(grouptris[j].verts[2], v2);
- VectorSubtract(v1, v0, diffvect1);
- VectorSubtract(v2, v1, diffvect2);
- CrossProduct( diffvect1, diffvect2, crossvect);
- VectorAdd(aveNorm, crossvect, aveNorm);
- VectorCopy(v0,vertices[num]);
- num++; // FIXME
- VectorCopy(v1,vertices[num]);
- num++; // add routine to add only verts that
- VectorCopy(v2,vertices[num]);
- num++; // have not already been added
- }
-
- assert (num >= 3);
-// figure out the best plane projections
- DOsvdPlane ((float*)vertices, num, (float *)&n, (float *)&base);
-
- if (DotProduct(aveNorm,n) < 0.0f)
- {
- VectorScale(n, -1.0f, n);
- }
- VectorNormalize(n,n);
- if (fabs(n[2]) < .57)
- {
- CrossProduct( zaxis, n, crossvect);
- VectorCopy(crossvect, u);
- }
- else
- {
- CrossProduct( yaxis, n, crossvect);
- VectorCopy(crossvect, u);
- }
- VectorNormalize(u,u);
- CrossProduct( n, u, crossvect);
- VectorCopy(crossvect, v);
- VectorNormalize(v,v);
-
- num = 0;
-
- for ( j = 0; j < 3; j++)
- {
- groupMin[j] = 1e30f;
- groupMax[j] = -1e30f;
- }
-
- for ( j = 0; j < numtris; j++)
- {
- for ( k = 0; k < 3; k++)
- {
- VectorCopy(grouptris[j].verts[k],v0);
- VectorSubtract(v0, base, v0);
- uvw[0] = DotProduct(v0, u);
- uvw[1] = DotProduct(v0, v);
- uvw[2] = DotProduct(v0, n);
- VectorCopy(uvw,uvs[num]);
- num++;
- for ( l = 0; l < 3; l++)
- {
- if (uvw[l] < groupMin[l])
- {
- groupMin[l] = uvw[l];
- }
- if (uvw[l] > groupMax[l])
- {
- groupMax[l] = uvw[l];
- }
- }
- }
- }
-
- xwidth = ceil(0 - groupMin[0]) + 2; // move right of origin and avoid overlap
- ywidth = ceil(0 - groupMin[1]) + 2; // move "above" origin
-
- for ( j=0; j < numverts; j++)
- {
- uFinal[finalcount] = uvs[j][0] + xwidth + xbase;
- vFinal[finalcount] = uvs[j][1] + ywidth;
- if (uFinal[finalcount] < uvwMin[0])
- {
- uvwMin[0] = uFinal[finalcount];
- }
- if (uFinal[finalcount] > uvwMax[0])
- {
- uvwMax[0] = uFinal[finalcount];
- }
- if (vFinal[finalcount] < uvwMin[1])
- {
- uvwMin[1] = vFinal[finalcount];
- }
- if (vFinal[finalcount] > uvwMax[1])
- {
- uvwMax[1] = vFinal[finalcount];
- }
- finalcount++;
- }
-
- fprintf(grpfile,"svdPlaned Group min: ( %f , %f )\n",groupMin[0] + xwidth + xbase, groupMin[1] + ywidth);
- fprintf(grpfile,"svdPlaned Group max: ( %f , %f )\n",groupMax[0] + xwidth + xbase, groupMax[1] + ywidth);
-
- finalcount = finalstart;
+ //=======================
+ // NEW GEN
+ //=======================
+
+ void NewGen (char *ModelFile, char *OutputName, int width, int height)
+ {
+ trigroup_t *triangles;
+ triangle_t *ptri;
+ triangle_t *grouptris;
+ mesh_node_t *pmnodes;
+
+ vec3_t *vertices;
+ vec3_t *uvs;
+ vec3_t aveNorm, crossvect;
+ vec3_t diffvect1, diffvect2;
+ vec3_t v0, v1, v2;
+ vec3_t n, u, v;
+ vec3_t base, zaxis, yaxis;
+ vec3_t uvwMin, uvwMax;
+ vec3_t groupMin, groupMax;
+ vec3_t uvw;
+
+ float *uFinal, *vFinal;
+ unsigned char *newpic;
+
+ int finalstart = 0, finalcount = 0;
+ int xbase = 0, xwidth = 0, ywidth = 0;
+ int *todo, *done, finished;
+ int i, j, k, l; //counters
+ int groupnum, numtris, numverts, num;
+ int count;
+ FILE *grpfile;
+ long datasize;
+
+ for ( i = 0; i<3; i++)
+ {
+ aveNorm[i] = 0;
+ uvwMin[i] = 1e30f;
+ uvwMax[i] = -1e30f;
+ }
+
+ pmnodes = NULL;
+ ptri = NULL;
+ triangles = NULL;
+
+ zaxis[0] = 0;
+ zaxis[1] = 0;
+ zaxis[2] = 1;
+
+ yaxis[0] = 0;
+ yaxis[1] = 1;
+ yaxis[2] = 0;
+
+ LoadTriangleList (ModelFile, &ptri, &fmheader.num_tris, &pmnodes, &fmheader.num_mesh_nodes);
+
+ todo = (int*)SafeMalloc(fmheader.num_tris*sizeof(int), "NewGen");
+ done = (int*)SafeMalloc(fmheader.num_tris*sizeof(int), "NewGen");
+ triangles = (trigroup_t*)SafeMalloc(fmheader.num_tris*sizeof(trigroup_t), "NewGen");
+
+ for ( i=0; i < fmheader.num_tris; i++)
+ {
+ todo[i] = false;
+ done[i] = false;
+ triangles[i].triangle = ptri[i];
+ triangles[i].group = 0;
+ }
+
+ groupnum = 0;
+
+ // transitive closure algorithm follows
+ // put all triangles who transitively share vertices into separate groups
+
+ while (1)
+ {
+ for ( i = 0; i < fmheader.num_tris; i++)
+ {
+ if (!done[i])
+ {
+ break;
+ }
+ }
+ if ( i == fmheader.num_tris)
+ {
+ break;
+ }
+ finished = false;
+ todo[i] = true;
+ while (!finished)
+ {
+ finished = true;
+ for ( i = 0; i < fmheader.num_tris; i++)
+ {
+ if (todo[i])
+ {
+ done[i] = true;
+ triangles[i].group = groupnum;
+ todo[i] = false;
+ for ( j = 0; j < fmheader.num_tris; j++)
+ {
+ if ((!done[j]) && (ShareVertex(triangles[i],triangles[j])))
+ {
+ todo[j] = true;
+ finished = false;
+ }
+ }
+ }
+ }
+ }
+ groupnum++;
+ }
+ uFinal = (float*)SafeMalloc(3*fmheader.num_tris*sizeof(float), "NewGen");
+ vFinal = (float*)SafeMalloc(3*fmheader.num_tris*sizeof(float), "NewGen");
+
+ grpfile = fopen("grpdebug.txt","w");
+
+
+ for (i = 0; i < groupnum; i++)
+ {
+
+ fprintf(grpfile,"Group Number: %d\n", i);
+
+ numtris = GetNumTris(triangles, i); // number of triangles in group i
+ numverts = numtris * 3;
+
+ fprintf(grpfile,"%d triangles.\n", numtris);
+
+ vertices = (vec3_t*)SafeMalloc(numverts*sizeof(vec3_t), "NewGen");
+ uvs = (vec3_t*)SafeMalloc(numverts*sizeof(vec3_t), "NewGen");
+ grouptris = (triangle_t*)SafeMalloc(numtris*sizeof(triangle_t), "NewGen");
+
+ for (count = 0; count < fmheader.num_tris; count++)
+ {
+ if (triangles[count].group == i)
+ {
+ fprintf(grpfile,"Triangle %d\n", count);
+ }
+ }
+ fprintf(grpfile,"\n");
+
+
+
+
+ GetOneGroup(triangles, i, grouptris);
+
+ num = 0;
+ for (j = 0; j < numtris; j++)
+ {
+ VectorCopy(grouptris[j].verts[0], v0);
+ VectorCopy(grouptris[j].verts[1], v1);
+ VectorCopy(grouptris[j].verts[2], v2);
+ VectorSubtract(v1, v0, diffvect1);
+ VectorSubtract(v2, v1, diffvect2);
+ CrossProduct( diffvect1, diffvect2, crossvect);
+ VectorAdd(aveNorm, crossvect, aveNorm);
+ VectorCopy(v0,vertices[num]);
+ num++; // FIXME
+ VectorCopy(v1,vertices[num]);
+ num++; // add routine to add only verts that
+ VectorCopy(v2,vertices[num]);
+ num++; // have not already been added
+ }
+
+ assert (num >= 3);
+ // figure out the best plane projections
+ DOsvdPlane ((float*)vertices, num, (float *)&n, (float *)&base);
+
+ if (DotProduct(aveNorm,n) < 0.0f)
+ {
+ VectorScale(n, -1.0f, n);
+ }
+ VectorNormalize(n,n);
+ if (fabs(n[2]) < .57)
+ {
+ CrossProduct( zaxis, n, crossvect);
+ VectorCopy(crossvect, u);
+ }
+ else
+ {
+ CrossProduct( yaxis, n, crossvect);
+ VectorCopy(crossvect, u);
+ }
+ VectorNormalize(u,u);
+ CrossProduct( n, u, crossvect);
+ VectorCopy(crossvect, v);
+ VectorNormalize(v,v);
+
+ num = 0;
+
+ for ( j = 0; j < 3; j++)
+ {
+ groupMin[j] = 1e30f;
+ groupMax[j] = -1e30f;
+ }
+
+ for ( j = 0; j < numtris; j++)
+ {
+ for ( k = 0; k < 3; k++)
+ {
+ VectorCopy(grouptris[j].verts[k],v0);
+ VectorSubtract(v0, base, v0);
+ uvw[0] = DotProduct(v0, u);
+ uvw[1] = DotProduct(v0, v);
+ uvw[2] = DotProduct(v0, n);
+ VectorCopy(uvw,uvs[num]);
+ num++;
+ for ( l = 0; l < 3; l++)
+ {
+ if (uvw[l] < groupMin[l])
+ {
+ groupMin[l] = uvw[l];
+ }
+ if (uvw[l] > groupMax[l])
+ {
+ groupMax[l] = uvw[l];
+ }
+ }
+ }
+ }
+
+ xwidth = ceil(0 - groupMin[0]) + 2; // move right of origin and avoid overlap
+ ywidth = ceil(0 - groupMin[1]) + 2; // move "above" origin
+
+ for ( j=0; j < numverts; j++)
+ {
+ uFinal[finalcount] = uvs[j][0] + xwidth + xbase;
+ vFinal[finalcount] = uvs[j][1] + ywidth;
+ if (uFinal[finalcount] < uvwMin[0])
+ {
+ uvwMin[0] = uFinal[finalcount];
+ }
+ if (uFinal[finalcount] > uvwMax[0])
+ {
+ uvwMax[0] = uFinal[finalcount];
+ }
+ if (vFinal[finalcount] < uvwMin[1])
+ {
+ uvwMin[1] = vFinal[finalcount];
+ }
+ if (vFinal[finalcount] > uvwMax[1])
+ {
+ uvwMax[1] = vFinal[finalcount];
+ }
+ finalcount++;
+ }
+
+ fprintf(grpfile,"svdPlaned Group min: ( %f , %f )\n",groupMin[0] + xwidth + xbase, groupMin[1] + ywidth);
+ fprintf(grpfile,"svdPlaned Group max: ( %f , %f )\n",groupMax[0] + xwidth + xbase, groupMax[1] + ywidth);
+
+ finalcount = finalstart;
+
+ for ( count = 0; count < numverts; count++)
+ {
+ fprintf(grpfile,"Vertex %d: ( %f , %f , %f )\n",count,vertices[count][0],vertices[count][1],vertices[count][2]);
+ fprintf(grpfile,"svdPlaned: ( %f , %f )\n",uFinal[finalcount],vFinal[finalcount++]);
+ }
+
+ finalstart = finalcount;
+
+ fprintf(grpfile,"\n");
+
+ free(vertices);
+ free(uvs);
+ free(grouptris);
+
+ xbase += ceil(groupMax[0] - groupMin[0]) + 2;
+
+ }
+
+ fprintf(grpfile,"Global Min ( %f , %f )\n",uvwMin[0],uvwMin[1]);
+ fprintf(grpfile,"Global Max ( %f , %f )\n",uvwMax[0],uvwMax[1]);
+
+
+ ScaleTris(uvwMin, uvwMax, width, height, uFinal, vFinal, finalcount);
+
+ for (k = 0; k < finalcount; k++)
+ {
+ fprintf(grpfile, "scaled vertex %d: ( %f , %f )\n",k,uFinal[k],vFinal[k]);
+ }
+
+ // i've got the array of vertices in uFinal and vFinal. Now I need to write them and draw lines
+
+ datasize = width * height*sizeof(unsigned char);
+ newpic = (unsigned char*)SafeMalloc(datasize, "NewGen");
+ memset(newpic,0,datasize);
+ memset(pic_palette,0,sizeof(pic_palette));
+ pic_palette[767] = pic_palette[766] = pic_palette[765] = 255;
+
+ k = 0;
+ while (k < finalcount)
+ {
+ NewDrawLine(uFinal[k], vFinal[k], uFinal[k+1], vFinal[k+1], newpic, width, height);
+ k++;
+ NewDrawLine(uFinal[k], vFinal[k], uFinal[k+1], vFinal[k+1], newpic, width, height);
+ k++;
+ NewDrawLine(uFinal[k], vFinal[k], uFinal[k-2], vFinal[k-2], newpic, width, height);
+ k++;
+ fprintf(grpfile, "output tri with verts %d, %d, %d", k-2, k-1, k);
+ }
+
+ WritePCXfile (OutputName, newpic, width, height, pic_palette);
+
+ fclose(grpfile);
+
+ free(todo);
+ free(done);
+ free(triangles);
+ free(newpic);
+ return;
+ }
+ void NewDrawLine(int x1, int y1, int x2, int y2, unsigned char* picture, int width, int height)
+ {
+ long dx, dy;
+ long adx, ady;
+ long count;
+ float xfrac, yfrac, xstep, ystep;
+ unsigned long sx, sy;
+ float u, v;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ adx = abs(dx);
+ ady = abs(dy);
+
+ count = adx > ady ? adx : ady;
+ count++;
+
+ if(count > 300)
+ {
+ printf("Bad count\n");
+ return; // don't ever hang up on bad data
+ }
+
+ xfrac = x1;
+ yfrac = y1;
+
+ xstep = (float)dx/count;
+ ystep = (float)dy/count;
+
+ switch(LineType)
+ {
+ case LINE_NORMAL:
+ do
+ {
+ if(xfrac < width && yfrac < height)
+ {
+ picture[(long)yfrac*width+(long)xfrac] = LineColor;
+ }
+ xfrac += xstep;
+ yfrac += ystep;
+ count--;
+ } while (count > 0);
+ break;
+ case LINE_FAT:
+ do
+ {
+ for (u=-0.1 ; u<=0.9 ; u+=0.999)
+ {
+ for (v=-0.1 ; v<=0.9 ; v+=0.999)
+ {
+ sx = xfrac+u;
+ sy = yfrac+v;
+ if(sx < width && sy < height)
+ {
+ picture[sy*width+sx] = LineColor;
+ }
+ }
+ }
+ xfrac += xstep;
+ yfrac += ystep;
+ count--;
+ } while (count > 0);
+ break;
+ case LINE_DOTTED:
+ do
+ {
+ if(count&1 && xfrac < width &&
+ yfrac < height)
+ {
+ picture[(long)yfrac*width+(long)xfrac] = LineColor;
+ }
+ xfrac += xstep;
+ yfrac += ystep;
+ count--;
+ } while (count > 0);
+ break;
+ default:
+ Error("Unknown <linetype> %d.\n", LineType);
+ }
+ }
+ */
+void ScaleTris( vec3_t min, vec3_t max, int Width, int Height, float* u, float* v, int verts ){