2010-08-02 5 views
1

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?

+0

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

+0

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

+0

Wow, 5k d'expérience et tout des questions ... Je pense que @SigTerm pourrait avoir un point ici. –

Répondre

0

Je vous propose de n'utiliser que du matériel C++ ici et de ne pas mélanger C malloc/free.

Utilisez plutôt un vecteur <> pour tous vos tableaux

+0

? Je suis désolé mais je ne peux vraiment pas voir le lien entre la question et votre réponse? – Calvin1602

+0

ma conjecture était que la raison pour laquelle il éprouvait des problèmes était qu'il faisait référence à des blocs de mémoire malloced ('vertex') à partir d'un conteneur stl. il n'y a pas vraiment de raison que l'on utilise malloc/free ici dans ce contexte quand un vecteur pourrait faire le travail –

0

SGI a distribué son tesselator à Mesa3D.org, donc il suffit de télécharger glu de mesa, compiler et lier. Mais vous devrez changer les paramètres du projet de DLL à LIB.

Questions connexes