View Full Version : surface types and smoothing
fractile
20th November 2004, 01:57 PM
I wrote a very simple export plugin. If I filter out surfaces only of type POLYGON some (visually random) surfaces don't get exported. So, what surface types exactly are there?
If I smooth the surfaces before exporting, nothing gets exported. The surface type will then be 8 (undocumented) if I remember correctly..
I got things working for now when I process all polygons regardless of their type and just try to triangulate them.. Is this the right way to go?
- Mikko
fractile
20th November 2004, 02:17 PM
I ofcourse forgot the most important problem I have:
Vertex normals seem to be all messed up. I read vertex normals from the vertices of triangulated (if not triangle already) surfaces (svertex->v->normal). They aren't even unit vectors, length is close to zero. The normals from the surface itself seems fine, but I need the vertex normals to allow smooth surfaces when rendering the resulting exported model..
Any Ideas what might be wrong? I tried recalculating normals using object_calc_normals_force(), but I didn't help.
Andy
21st November 2004, 04:40 AM
Can you post the main part or send the plugin code?
Andy
fractile
21st November 2004, 05:18 AM
Here comes the essential part of the source code.
FMeshBuilder is an object that generated my mesh format.
The line commented out in fmesh_export_triangle_surface() is the line that causes bad normals for vertices..
- - clip - -
static void fmesh_export_triangle_surface(Surface* surface, FMeshBuilder& builder, int materialindex)
{
printf("exporting surface..\n");
int vertexindex = -1;
for(List* v = surface->vertlist; v != NULL; v = v->next)
{
SVertex* vertex = (SVertex*)v->data;
FMeshVector3 pos(vertex->v->x, vertex->v->y, vertex->v->z);
// FMeshVector3 n(vertex->v->normal.x, vertex->v->normal.y, vertex->v->normal.z);
FMeshVector3 n(surface->normal.x, surface->normal.y, surface->normal.z);
FMeshVector3 tc(vertex->tx, vertex->ty, 0);
vertexindex = builder.addVertex(pos, &n, &tc);
}
builder.addFace(materialindex, vertexindex - 2, vertexindex - 1, vertexindex);
}
static void fmesh_export_object(ACObject* obj, FMeshBuilder& builder)
{
if(ac_object_get_num_surfaces(obj) > 0)
{
object_calc_normals_force(obj);
printf("exporting object..\n");
int materialindex = -1;
char* data = ac_object_get_data(obj);
if(data[0])
materialindex = builder.addMaterial(data);
else
materialindex = builder.addMaterial("default");
printf("materialindex = %u\n", materialindex);
List* surfaces = ac_object_get_surfacelist(obj);
for (List* s = surfaces; s != NULL; s = s->next)
{
Surface *surface = (Surface *)s->data;
// if(surface->type == SURFACE_POLYGON)
{
if(surface->numvert == 3)
{
fmesh_export_triangle_surface(surface, builder, materialindex);
}
else if(surface->numvert > 3)
{
// Triangulate surface
List* triangles = surface_get_triangulations(surface);
for(List* t = triangles; t != NULL; t = t->next)
{
Surface* triangle = (Surface*)t->data;
fmesh_export_triangle_surface(triangle, builder, materialindex);
surface_free(triangle);
}
list_free(&triangles);
}
else
printf("skipping numvert = %d surface ..\n", (int)surface->numvert);
}
// else
// printf("skipping non-polygon surface %d..\n", (int)surface->type);
}
}
List* children = ac_object_get_childrenlist(obj);
for(List* c = children; c != NULL; c = c->next)
fmesh_export_object((ACObject *)c->data, builder);
}
static void fmesh_export()
{
char *filename;
FILE *file;
char *filter[] = {"fmesh files", ".fmesh", "All files", "*", NULL};
filename = ac_get_save_filename("Export fmesh file", filter);
if((filename == NULL) || (*filename =='\0'))
return;
FMeshBuilder builder;
builder.begin("exported", 1, 1, 0);
fmesh_export_object(ac_get_world(), builder);
builder.writeToFile(filename);
}
AC3D_PLUGIN_FUNC int AC3DPluginInit(AC3DPluginInitData *d)
{
double ver = ac_get_version_number();
ac_add_command("fmesh_export_plugin", fmesh_export);
ac_add_export_menu_item("fmesh...", "ac3d fmesh_export_plugin");
return(0);
}
Andy
21st November 2004, 11:22 AM
There was a bug in surface_get_triangulations where sv normals got messed up. This should have been in the release you have.
See my private message.
Andy
fractile
1st March 2005, 10:55 AM
Argh! I'm now using AC3D 5.0 for linux, and the situation isn't any better.
SVertex normals for triangulated surfaces are still at random values (most often [0,0,0]). Should I also update my SDK header and rebuild my plugin with that? The ac_plugin.h that I have seems to be dated 22nd July 1999..
fractile
1st March 2005, 11:06 AM
The problem isn't in the triangulation anymore. It seems that the vertex normals are bad, even if I triagulate the model manually before exporting. AC3D shows the model correctly smoothed.
I added a printf() in the code below to see, where the normals go bad. All I get is lots of "SVertex normal: (0.000000, 0.000000, 0.000000)" messages..
static void fmesh_export_triangle_surface(Surface* surface, FMeshBuilder& builder, int materialindex)
{
printf("exporting surface..\n");
int vertexindex = -1;
for(List* v = surface->vertlist; v != NULL; v = v->next)
{
SVertex* vertex = (SVertex*)v->data;
FMeshVector3 pos(vertex->v->x, vertex->v->y, vertex->v->z);
//FMeshVector3 n(vertex->v->normal.x, vertex->v->normal.y, vertex->v->normal.z);
printf("SVertex normal: (%f, %f, %f)\n", vertex->v->normal.x, vertex->v->normal.y, vertex->v->normal.z);
FMeshVector3 n(surface->normal.x, surface->normal.y, surface->normal.z);
FMeshVector3 tc(vertex->tx, vertex->ty, 0);
vertexindex = builder.addVertex(pos, &n, &tc);
}
builder.addFace(materialindex, vertexindex - 2, vertexindex - 1, vertexindex);
}
Rest of the code is unchanged from what I posted earlier.
Andy
1st March 2005, 01:51 PM
The normal is part of the SVertex and not the Vertex.
You code appears to be accesing a normal which is part of the vertex. I can't see why this would compile, unless you have a very old header file.
In your code you should be using vertex->normal.
Aha - looked further down your message - a lot has changed since 1999...
I'll email you the new headers - which you will need for 5.0 anyway.
Andy
fractile
1st March 2005, 03:50 PM
Thanks a lot! I got the exporter plugin working. A six year update did help :) I haven't yet tried recompiling my other plugins..
vBulletin® v3.8.5, Copyright ©2000-2010, Jelsoft Enterprises Ltd.