Здравствуйте, Владимир_, Вы писали:
...
у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, yxiie, Вы писали:
Y>Здравствуйте, Владимир_, Вы писали:
Y>...
Y>у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. Y>поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.
Выставил, к сожалению не помогло.
Блин, я уже даже не знаю что делать
Здравствуйте, Владимир_, Вы писали:
Y>>у тебя наверное стоит опция выравнивать размер структры кратно 8 байтам, и компилятор добавляет лишние байты. Y>поставь опцию вуравнивать на 1 байт (/Zp1 помоему для VC) и будет все ок.
В_>Выставил, к сожалению не помогло.
В_>Блин, я уже даже не знаю что делать
может тогда трехмерный и одномерный массив неэквивалентны?
будет ли работать версия без стл с одномерным массивом и версия с стл трехмерным?
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, 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.
Видно юзается какой то принципиально иной подход
Здравствуйте, Владимир_, Вы писали:
В_>Ну неужели больше нет идей?
идея такая: vector<float> a; по внутренней структуре полностью эквивалентен float a[...];
ищи баги у себя в коде.
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, 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 нет.