J'utilise GLUTess pour tesseler des polygones. Après plusieurs tests, j'ai réalisé glu32.lib qui lie à glu32.dll, se bloque de temps en temps. Considérant que GLU que j'ai obtenu de l'opengl sdk, est solide comme un roc. Malheureusement, en ne liant pas à la DLL de Windows, cela signifie que j'ai besoin de glisser autour de GLU.dll avec mon application au lieu de compter sur GLU32.dll de Windows. Existe-t-il une version de GLU pouvant être liée de manière statique? Je ne veux vraiment pas avoir de dépendances dll pour son petit projet.Liaison statique GLU?
Merci
Mon code tesselator:
#include "StdAfx.h"
#include "CGlTesselator.h"
std::vector<GLdouble*> gluptrvec;
std::vector<GLfloat> tempvct;
std::vector<GLfloat> tempvcttex;
POINTFLOAT CurrentDimensions;
POINTFLOAT CurrentMinima;
void CALLBACK combineCallback(GLdouble coords[3], GLdouble *vertex_data[4],
GLdouble weight[4], GLdouble **dataOut)
{
GLdouble *vertex;
vertex = (GLdouble *) malloc(6 * sizeof(GLdouble));
if(vertex == NULL)
{
MessageBox(0,0,0,0);
}
vertex[0] = coords[0];
vertex[1] = coords[1];
//vertex[2] = coords[2];
*dataOut = vertex;
gluptrvec.push_back(vertex);
}
void CALLBACK vertexCallback(GLvoid *vertex)
{
GLdouble *ptr;
ptr = (GLdouble *) vertex;
if(ptr == NULL)
{
MessageBox(0,0,0,0);
}
double x = ptr[0];
double y = ptr[1];
double s = (x - CurrentMinima.x)/CurrentDimensions.x;
double t = (y - CurrentMinima.y)/CurrentDimensions.y;
tempvct.push_back((GLfloat)x);
tempvct.push_back((GLfloat)y);
tempvcttex.push_back((GLfloat)s);
tempvcttex.push_back((GLfloat)t);
//glTexCoord2d(s,t);
//glVertex2dv((GLdouble *) ptr);
}
void CALLBACK edgeflags(int flag)
{
}
CGlTesselator::CGlTesselator(void)
{
Init();
}
int CGlTesselator::Init(GLvoid)
{
// Create a new tessellation object
tobj = gluNewTess();
// Set callback functions
gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid (_stdcall *)(void)) &vertexCallback);
gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid (_stdcall *)(void)) &glBegin);
gluTessCallback(tobj, GLU_TESS_END, (GLvoid (_stdcall *)(void)) &glEnd);
gluTessCallback(tobj, GLU_TESS_COMBINE, (GLvoid (_stdcall *)(void))&combineCallback);
gluTessCallback(tobj, GLU_EDGE_FLAG, (GLvoid (_stdcall *)(void))&edgeflags);
return(1);
}
int CGlTesselator::Set_Winding_Rule(GLenum winding_rule)
{
// Set the winding rule
gluTessProperty(tobj, GLU_TESS_WINDING_RULE, winding_rule);
return(1);
}
int CGlTesselator::Render_Contour(GLdouble obj_data[][6], int num_vertices)
{
for (int x = 0; x < num_vertices; ++x) //loop through the vertices
{
gluTessVertex(tobj, obj_data[x], obj_data[x]); //store the vertex
}
return(1);
}
int CGlTesselator::Begin_Polygon(GLvoid)
{
gluTessBeginPolygon(tobj, NULL);
return(1);
}
int CGlTesselator::End_Polygon(GLvoid)
{
try
{
gluTessEndPolygon(tobj);
}
catch (int ix)
{
}
if(gluptrvec.size() > 0)
{
for(unsigned int i = 0; i < gluptrvec.size(); i++)
{
free(gluptrvec[i]);
}
}
gluptrvec.clear();
return(1);
}
int CGlTesselator::Begin_Contour(GLvoid)
{
gluTessBeginContour(tobj);
return(1);
}
int CGlTesselator::End_Contour(GLvoid)
{
try
{
if(tobj == NULL)
{
MessageBox(0,0,0,0);
}
gluTessEndContour(tobj);
}
catch (...)
{
}
return(1);
}
int CGlTesselator::End(GLvoid)
{
gluDeleteTess(tobj);
return(1);
}
void CGlTesselator::SetDimensions(POINTFLOAT dims, POINTFLOAT min)
{
CurrentDimensions = dims;
CurrentMinima = min;
}
CGlTesselator::~CGlTesselator(void)
{
End();
}
void CGlTesselator::TransferVerticies(GLuint &polyvbo, GLuint &texvbo,UINT &vbocount, UINT &texcount)
{
if (tempvct.size() > 0)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB,polyvbo);
glBufferDataARB(GL_ARRAY_BUFFER_ARB,sizeof(GLfloat) * tempvct.size(),&tempvct[0],GL_STATIC_COPY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,texvbo);
glBufferDataARB(GL_ARRAY_BUFFER_ARB,sizeof(GLfloat) *
tempvcttex.size(),&tempvcttex[0],GL_STATIC_COPY);
}
vbocount = tempvct.size();
texcount = tempvcttex.size();
tempvct.clear();
tempvcttex.clear();
}
Y at-il quelque chose qui cloche?
Windows glu32.dll est une dépendance standard pour toutes les applications Windows OpenGL. Si elle tombe en panne - le problème le plus probable est avec votre code. Si une autre version ne plante pas, cela ne signifie pas que votre code est correct. "Y a-t-il une version de GLU qui est connectable statiquement?" Vérifiez la version linux de glu ou mesa3d. Si c'est LGPL - il sera lié statiquement. Encore, ce sera une mauvaise idée, vous devriez vraiment utiliser les composants fournis par le système. – SigTerm
Aussi, je vous recommande de faire au moins quelques choses vous-même au lieu de demander l'aide d'autres personnes chaque fois que le problème se pose. Faites un peu de recherche, google un peu, lisez "comment poser des questions de manière intelligente" et ainsi de suite. – SigTerm
Wow, 5k d'expérience et tout des questions ... Je pense que @SigTerm pourrait avoir un point ici. –