Community
FBX Forum
Welcome to Autodesk’s FBX Forums. Share your knowledge, ask questions, and explore popular FBX topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

ViewScene and Lighting/Texturing revisited

6 REPLIES 6
Reply
Message 1 of 7
simonwakley
256 Views, 6 Replies

ViewScene and Lighting/Texturing revisited

About 4 years ago there was a discussion about the lighting and texturing of the ViewScene example and I am using the 2011.3 SDK and I only ever get Wire Mesh objects in ViewScene. I can force them to draw if I set
lGLPrimitive = GL_POLYGON;
in GlDrawMesh(

but no Textures.

Have the issues from the 2008 discussion been added to the latest SDK or is there an update.

Anyone have an improvement on the the ViewScene example they are willing to share?

Incidentally, I have tried various ways to get the ViewScene code to link in with my OpenGL program and whilst it links and mostly runs some of the FBX structures appear to be corrupted, so I would not even get the Meshes. When I build it into a dll and dynamically link in, all is fine. Anyone else had experience with this. It works fine in the dll I build -VC2008.

Simon
6 REPLIES 6
Message 2 of 7
jiayang.xu
in reply to: simonwakley

Hello Simon,
As a sample, Viewscene supports tga texture for a pretty long time already. Please check this out:
http://area.autodesk.com/forum/autodesk-fbx/fbx-sdk/viewscene-texture-mapping-issue/
Message 3 of 7
simonwakley
in reply to: simonwakley

Hi,

Thanks. I see the code in the ViewScene program, but the provided Humanoid does not texture so I assume it is using a different texture type. Is there a sample file with TGA texturing I can try?
Message 4 of 7
jiayang.xu
in reply to: simonwakley

Sorry, the samples I have are from other customers which I cannot post without their permission.
You may contact m210 who posted the http://area.autodesk.com/forum/autodesk-fbx/fbx-sdk/viewscene-texture-mapping-issue/, the one he posted there has the supported targa textures.
Message 5 of 7
simonwakley
in reply to: simonwakley

So the latest on this is that the existing version of ViewScene as per 2011.3 only shows wireframe unless the model has a .tga texture (apparently, but no .tga textured model is supplied :-{

If there is no texture, then it defaults to wireframe. I have added a menu option (which is also in the 2012.2 SDK) to allow you to choose wireframe, textured or lighted

I hacked this together from my OpenGL code so it is very ugly but functional and easy to follow (I think)

Since I have been asking for the code myself it is only fair I post this 🙂 If anyone has a better solution, I'd love to see it. ViewScene will now draw wireframe or lighted and will apparently texture when it can. If ANYONE has other than .tga texturing for ViewScene I'm very interested.

Simon


in main.cxx create menus
int lDrawModeMenu = glutCreateMenu(DrawModeSelectionCallback);
glutAddMenuEntry("Wire Frame", 0);
glutAddMenuEntry("Lighted", 1);
glutAddMenuEntry("Textured", 2);


bit later in same function
// Build the main menu.
glutCreateMenu(MenuSelectionCallback);
glutAddSubMenu("Select Camera", lCameraMenu);
glutAddSubMenu("Select Animation Stack", lAnimStackMenu);
if (lBindPoseCount>0 || lRestPoseCount>0)
glutAddSubMenu("Go to Pose", lPoseMenu);
glutAddMenuEntry("Play", PLAY_ANIMATION);
glutAddSubMenu("Draw Mode", lDrawModeMenu); ADDED SJW
glutAddMenuEntry("Exit", EXIT_ITEM);
glutAttachMenu(GLUT_RIGHT_BUTTON);

call function added global in main.cxx

int gDrawMode = 0;
void DrawModeSelectionCallback(int pItem)
{
gDrawMode = pItem;
gSceneStatus = MUST_BE_REFRESHED;
}


// Modify call to GlDrawMesh in DrawMesh() file DrawScene.cxx

GlDrawMesh(pGlobalPosition,
lMesh,
lVertexArray,
gDrawMode);


In GlFunctions.cxx

// This is commented out lDrawMode = (lDrawMode == DRAW_MODE_TEXTURED && lTexture) ? lDrawMode : DRAW_MODE_WIREFRAME;
lDrawMode = (lDrawMode != DRAW_MODE_TEXTURED) ? lDrawMode : (lTexture ? lDrawMode : DRAW_MODE_WIREFRAME);

//printf("Want to draw %d, going to %d\n", pDrawMode, lDrawMode);

int lGLPrimitive = lDrawMode == DRAW_MODE_WIREFRAME ? GL_LINE_LOOP : GL_POLYGON;

Then in the polygon BEFORE the vertex loop add
// Polygon loop for (lPolygonIndex = 0; lPolygonIndex < lPolygonCount; lPolygonIndex++)


// Shaded, just find the normal for the surface

if (lDrawMode == DRAW_MODE_LIGHTED)
{
VECTOR normal;
POLYGON poly;

// Need 3 points for a normal on a plane.
pVertex = (GLdouble *)pVertexArray;
poly.x1 = *pVertex++;
poly.y1 = *pVertex++;
poly.z1 = *pVertex++;

pVertex = (GLdouble *)pVertexArray;
poly.x2 = *pVertex++;
poly.y2 = *pVertex++;
poly.z2 = *pVertex++;

pVertex = (GLdouble *)pVertexArray;
poly.x3 = *pVertex++;
poly.y3 = *pVertex++;
poly.z3 = *pVertex++;

determine_normal(&poly, normal);
glNormal3fv(normal);

}

NEEDED DEFS and FUNCTIONS

typedef struct tagPOLYGON
{ /* Polygon information */
float x1; /* First vertex x coordinate */
float y1; /* First vertex y coordinate */
float z1; /* First vertex z coordinate */
float x2; /* Second vertex x coordinate */
float y2; /* Second vertex y coordinate */
float z2; /* Second vertex z coordinate */
float x3; /* Third vertex x coordinate */
float y3; /* Third vertex y coordinate */
float z3; /* Third vertex z coordinate */
float x4; /* Fourth vertex x coordinate */
float y4; /* Fourth vertex y coordinate */
float z4; /* Fourth vertex z coordinate */
}POLYGON;

typedef POLYGON *PPOLYGON;
typedef GLfloat VECTOR; /* 3 vector */


#ifndef VSMALL
#define VSMALL (1e-10) /* Small float */
#endif

float vecnorm(VECTOR v)
{
/* Normalize vector to unit length. Return its original length. */

float x, y, z, s, r, rr;

/* Make the vector components positive */
x = v; y = v; z = v;
if( x < 0.0 )
x = -x;
if( y < 0.0 )
y = -y;
if( z < 0.0 )
z = -z;

/* Find the square of the length */
s = x * x + y * y + z * z;

/* The best guess of the length is the largest component. Find it. */
if( x < y )
x = y;
if( x < z )
x = z;

if( x < VSMALL )
{
rr = 0.0;
v = v = v = 0.0;
}
else
{
/* Polish up the guess using 3 in-line N-R iterations */
r = x + s / x;
r = 0.25 * r + s / r;
r = 0.5 * ( r + s / r );

/* Normalize the vector */
rr = r;
r = 1.0 / r;
v *= r;
v *= r;
v *= r;
}

/* Return the length */
return( rr );
}


void determine_normal(PPOLYGON poly, VECTOR normal)
{
/* It is necessary to determine the normals of each polygon in order to */
/* do the lighting correctly. Note only the first three vertices of the */
/* polygon are used for this normal calculation. */

float A, B, C;

/* Firstly, find the plane coefficients */
/* (page 308, "Computer Graphics", Hearn and Baker) */
A = poly->y1*(poly->z2 - poly->z3) + poly->y2*(poly->z3 - poly->z1) + poly->y3*(poly->z1 - poly->z2);
B = poly->z1*(poly->x2 - poly->x3) + poly->z2*(poly->x3 - poly->x1) + poly->z3*(poly->x1 - poly->x2);
C = poly->x1*(poly->y2 - poly->y3) + poly->x2*(poly->y3 - poly->y1) + poly->x3*(poly->y1 - poly->y2);

/* The surface normal vector has coordinates (A, B, C) */
normal = A;
normal = B;
normal = C;

vecnorm(normal);
}
Message 6 of 7
simonwakley
in reply to: simonwakley

Plus

#define DRAW_MODE_WIREFRAME 0
#define DRAW_MODE_LIGHTED 1
#define DRAW_MODE_TEXTURED 2
Message 7 of 7
Anonymous
in reply to: simonwakley

Hi Simon,

In the meantime, I have managed to get lighting/texturing in a customized version of ViewScene sample. But you'd need to do your due-diligence as well, as I don't have physical time to pack it as a stand-alone sample. would you like to send it to you?

Best regards,
Rumen Filkov

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report