Author Topic: Merging Triangles into Quads  (Read 433 times)

Ever since Obj2Blb was released all my models have been made out of triangles.
To try and convert them, I wrote up a script that checks if they have the same normals and share at least 3 vertices.
Code: [Select]
function ReadBlbFile(%input)
{
if(isFile(%input))
{
%file = new fileObject();
%file.openForRead(%input);
$CBLBDat = new ScriptObject(){};
$CBLBDat.fc = "0";
$CBLBDat.lc = "0";
$CBLBDat.size = %file.readLine();
while(!%file.isEOF())
{
%line = %file.readLine();
if(%line $= "POSITION:")
{
$CBLBDat.face[$CBLBDat.fc] = new ScriptObject(){};
$CBLBDat.face[$CBLBDat.fc].vertex1 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].vertex2 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].vertex3 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].vertex4 = %file.readLine();
%file.readLine();
$CBLBDat.face[$CBLBDat.fc].uv1 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].uv2 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].uv3 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].uv4 = %file.readLine();
%nextline = %file.readLine();
if(%nextline $= "COLORS:")
{
$CBLBDat.face[$CBLBDat.fc].color1 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].color2 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].color3 = %file.readLine();
$CBLBDat.face[$CBLBDat.fc].color4 = %file.readLine();
}
%file.readLine();
$CBLBDat.face[$CBLBDat.fc].normal = %file.readLine();
%file.readLine();
%file.readLine();
%file.readLine();
$CBLBDat.fc++;
}
if(!$CBLBDat.fc)
{
$CBLBDat.line[$CBLBDat.lc] = %line;
$CBLBDat.lc++;
}
}
}
}
function SameVertexCount(%face1, %face2) //Checks if 2 faces could be in the same quad
{
if(%face1.normal1 $= %face2.normal1)
{
%samecount = 0;
for(%a=1;%a<5;%a++)
{
if(%face1.vertex[%a] $= %face2.vertex1)
%sameCount++;
if(%face1.vertex[%a] $= %face2.vertex2)
%sameCount++;
if(%face1.vertex[%a] $= %face2.vertex3)
%sameCount++;
if(%face1.vertex[%a] $= %face2.vertex4)
%sameCount++;
}
return %samecount;
}
return 0;
}
function getUncommonVertex(%face1, %face2) //Returns the vertex that they don't share
{
%vertexExist[%face1.vertex1]++;
%vertexExist[%face1.vertex2]++;
%vertexExist[%face1.vertex3]++;
%vertexExist[%face1.vertex4]++;
%vertexExist[%face2.vertex1]++;
%vertexExist[%face2.vertex2]++;
%vertexExist[%face2.vertex3]++;
%vertexExist[%face2.vertex4]++;
for(%a=1;%a<5;%a++)
{
if(%vertexExist[%face2.vertex[%a]] < 2)
return %a;
}
}
function exportBLBFile(%output)
{
%file = new FileObject();
%file.openForWrite(%output);
%file.writeline($CBLBDat.size);
for(%a=0;%a<$CBLBDat.lc;%a++)
%file.writeLine($CBLBDat.line[%a]);
for(%a=0;%a<$CBLBDat.fc;%a++)
{
for(%b=$CBLBDat.fc;%b>0;%b--)
{
if(isObject($CBLBDat.face[%b]) && $CBLBDat.face[%b] != $CBLBDat.face[%a])
{
if(SameVertexCount($CBLBDat.face[%a],$CBLBDat.face[%b]))
{
%vert = getUncommonVertex($CBLBDat.face[%a],$CBLBDat.face[%b]);
$CBLBDat.face[%a].vertex[%vert] = $CBLBDat.face[%b].vertex[%vert];
$CBLBDat.face[%b].delete();
}
}
}
}
for(%a=0;%a<$CBLBDat.fc;%a++)
{
if(isObject($CBLBDat.face[%a]))
{
%fc++;
%file.writeline("TEX:SIDE");
%file.writeline("POSITION:");
%file.writeline($CBLBDat.face[%a].vertex1);
%file.writeline($CBLBDat.face[%a].vertex2);
%file.writeline($CBLBDat.face[%a].vertex3);
%file.writeline($CBLBDat.face[%a].vertex4);
%file.writeline("UV COORDS:");
%file.writeline($CBLBDat.face[%a].uv1);
%file.writeline($CBLBDat.face[%a].uv2);
%file.writeline($CBLBDat.face[%a].uv3);
%file.writeline($CBLBDat.face[%a].uv4);
if(getWordCount($CBLBDat.face[%a].color1))
{
%file.writeline("COLORS:");
%file.writeline($CBLBDat.face[%a].color1);
%file.writeline($CBLBDat.face[%a].color2);
%file.writeline($CBLBDat.face[%a].color3);
%file.writeline($CBLBDat.face[%a].color4);
}
%file.writeline("NORMALS:");
%file.writeline($CBLBDat.face[%a].normal);
%file.writeline($CBLBDat.face[%a].normal);
%file.writeline($CBLBDat.face[%a].normal);
%file.writeline($CBLBDat.face[%a].normal);
%file.writeline("");
}
}
%file.writeline(%fc);
%file.close();
}
It reads and writes, it just doesn't detect if 2 triangles are the same quad. But hey, at least they share a slight resemblance.What is wrong with it?

3dtoblb can convert quad model formats into BLBs

EDIT: I mean, the exporter will convert the tris into quads and then export it to a quad format, which is how BLBs like models.


nvm I didn't see that there was a new official obj2blb.
« Last Edit: October 27, 2012, 02:59:10 AM by Destiny/Zack0Wack0 »