Re[3]: OpenGL + STL
От: yxiie Украина www.enkord.com
Дата: 09.11.04 14:24
Оценка:
Здравствуйте, Владимир_, Вы писали:

...

у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.
... << RSDN@Home 1.1.3 stable >>
Re[4]: OpenGL + STL
От: Владимир_  
Дата: 09.11.04 16:30
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>Здравствуйте, Владимир_, Вы писали:


Y>...


Y>у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. Y>поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.

Выставил, к сожалению не помогло.
Блин, я уже даже не знаю что делать
Re[5]: OpenGL + STL
От: yxiie Украина www.enkord.com
Дата: 09.11.04 16:33
Оценка:
Здравствуйте, Владимир_, Вы писали:

Y>>у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. Y>поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.

В_>Выставил, к сожалению не помогло.
В_>Блин, я уже даже не знаю что делать

может тогда трехмерный и одномерный массив неэквивалентны?
будет ли работать версия без стл с одномерным массивом и версия с стл трехмерным?
... << RSDN@Home 1.1.3 stable >>
Re[4]: OpenGL + STL
От: Владимир_  
Дата: 09.11.04 16:35
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>Здравствуйте, Владимир_, Вы писали:


Y>...


Y>у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. Y>поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.


Вот е мое, #pragma pack(1) + /Zp1 и то не лечит.

У меня для проекта в котором я эксперементирую такие опции стоят:
/nologo /Zp1 /MLd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Debug/tst1.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
Re[6]: OpenGL + STL
От: Владимир_  
Дата: 09.11.04 16:54
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>Здравствуйте, Владимир_, Вы писали:


Y>>>у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. Y>поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.

В_>>Выставил, к сожалению не помогло.
В_>>Блин, я уже даже не знаю что делать

Y>может тогда трехмерный и одномерный массив неэквивалентны?

Y>будет ли работать версия без стл с одномерным массивом и версия с стл трехмерным?
Версия без STL отлично отработала с одномерным массивом.

GLfloat ctrlpoints[48] = {-1.5, -1.5, 4.0,-0.5, -1.5, 2.0, 
    0.5, -1.5, -1.0, 1.5, -1.5, 2.0, 
   -1.5, -0.5, 1.0, -0.5, -0.5, 3.0, 
    0.5, -0.5, 0.0, 1.5, -0.5, -1.0, 
   -1.5, 0.5, 4.0, -0.5, 0.5, 0.0, 
    0.5, 0.5, 3.0, 1.5, 0.5, 4.0, 
   -1.5, 1.5, -2.0, -0.5, 1.5, -2.0, 
   0.5, 1.5, 0.0, 1.5, 1.5, -1.0
};

     glMap2f(GL_MAP2_VERTEX_3, 0.0f, 1.0f, 3, 4,
           0, 1, 12, 4, &ctrlpoints[0]);

Отлично отработала

А вот версия с стл и с трехмерным массивом меня к сожалению не устраивает,
Мне нужен именно одномерным массив трехмерных точек.
Мне вот что кажется странным, что в инете я ни где не нашел ссылок на работу OGL с STL.
Видно юзается какой то принципиально иной подход
Re: OpenGL + STL
От: Владимир_  
Дата: 10.11.04 06:23
Оценка:
Ну неужели больше нет идей?
Re[2]: OpenGL + STL
От: yxiie Украина www.enkord.com
Дата: 10.11.04 09:28
Оценка:
Здравствуйте, Владимир_, Вы писали:

В_>Ну неужели больше нет идей?


идея такая: vector<float> a; по внутренней структуре полностью эквивалентен float a[...];
ищи баги у себя в коде.
... << RSDN@Home 1.1.3 stable >>
Re[3]: OpenGL + STL
От: Владимир_  
Дата: 10.11.04 09:53
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>Здравствуйте, Владимир_, Вы писали:


В_>>Ну неужели больше нет идей?


Y>идея такая: vector<float> a; по внутренней структуре полностью эквивалентен float a[...];

Y>ищи баги у себя в коде.


#include <stdafx.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <vector>
 #pragma pack(1)
using namespace std;

class CPoint3D
{
public:
    float x;
    float y;
    float z;

    CPoint3D () { x = y = z = 0.0f;}
    CPoint3D (float c1, float c2, float c3)
    {
        x = c1;
        y = c2;
        z = c3;
    }

    CPoint3D& operator=(const CPoint3D& pt)
    {
        x = pt.x;
        y = pt.y;
        z = pt.z;
        return *this;
    }

    CPoint3D (const CPoint3D& pt)
    {
        *this = pt;
    }
};

vector<CPoint3D> myvector;
CPoint3D point;

GLfloat ctrlpoints[48] = {-1.5, -1.5, 4.0,-0.5, -1.5, 2.0, 
    0.5, -1.5, -1.0, 1.5, -1.5, 2.0, 
   -1.5, -0.5, 1.0, -0.5, -0.5, 3.0, 
    0.5, -0.5, 0.0, 1.5, -0.5, -1.0, 
   -1.5, 0.5, 4.0, -0.5, 0.5, 0.0, 
    0.5, 0.5, 3.0, 1.5, 0.5, 4.0, 
   -1.5, 1.5, -2.0, -0.5, 1.5, -2.0, 
   0.5, 1.5, 0.0, 1.5, 1.5, -1.0
};

void fillmyvector (void)
{
    myvector.clear();    
    for (int i = 0; i <= 47; i++)
    {
        point.x = ctrlpoints[i];
        i++;
        point.y = ctrlpoints[i];
        i++;
        point.z = ctrlpoints[i];
        i++;
        myvector.push_back(point);
    }


}

void display(void)
{
   int i, j;

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glColor3f(1.0, 1.0, 1.0);
   glPushMatrix ();
   glRotatef(85.0, 1.0, 1.0, 1.0);
   for (j = 0; j <= 8; j++) {
      glBegin(GL_LINE_STRIP);
      for (i = 0; i <= 30; i++)
         glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
      glEnd();
      glBegin(GL_LINE_STRIP);
      for (i = 0; i <= 30; i++)
         glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
      glEnd();
   }
   glPopMatrix ();
   glFlush();
}

void init(void)
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
 //  glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
           0, 1, 12, 4, &ctrlpoints[0][0][0]);
     glMap2f(GL_MAP2_VERTEX_3, 0.0f, 1.0f, 3, 4,
//           0, 1, 12, 4, &myvector[0].x);
//     glMap2f(GL_MAP2_VERTEX_3, 0.0f, 1.0f, 3, 4,
//           0, 1, 12, 4, &ctrlpoints[0]);
   glEnable(GL_MAP2_VERTEX_3);
   glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
   glEnable(GL_DEPTH_TEST);
   glShadeModel(GL_FLAT);
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   if (w <= h)
      glOrtho(-4.0, 4.0, -4.0*(GLfloat)h/(GLfloat)w, 
              4.0*(GLfloat)h/(GLfloat)w, -4.0, 4.0);
   else
      glOrtho(-4.0*(GLfloat)w/(GLfloat)h, 
              4.0*(GLfloat)w/(GLfloat)h, -4.0, 4.0, -4.0, 4.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize (500, 500);
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   fillmyvector();
   init ();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}


Вот весь код тестового примера. Закомментированные строки работают, а строка с использованием STL нет.
Re: OpenGL + STL
От: Владимир_  
Дата: 11.11.04 10:00
Оценка:
?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.