Я новичок в Openframeworks и C++, но не в программировании вообще (PHP и Objective-C). Я создал класс, который рисует куб, где высота, ширина и глубина являются переменными. Я пытаюсь создать 3 версии указанного класса, каждый из которых имеет разные размеры.
Однако для каждого экземпляра используются первые измерения объекта. Я попытался переключить порядок рисования, и независимо от того, что нарисовано первым, используется для всех. Кроме того, я выставляю размеры на консоль и отправляются правильные размеры, но только первая версия рисуется.
cube.h
#ifndef _CUBE
#define _CUBE
#include "ofMain.h"
class cube
{
public:
void update();
void draw();
cube(float _w, float _h, float _d);
float w;
float h;
float d;
ofMesh mesh;
ofVbo myVbo;
private:
};
#endif
cube.cpp
#include "cube.h"
cube::cube(float _w, float _h, float _d)
{
w = _w;
h = _h;
d = _d;
static GLfloat vdata[8][3] = {
{-w, -h, -d}, {-w, h, -d},
{w, h, -d}, {w, -h, -d},
{-w, -h, d}, {w, -h, d},
{-w, h, d}, {w, h, d}
};
static GLint indices[6][4] = {
{3, 2, 1, 0},
{3, 5, 4, 0},
{3, 5, 7, 2},
{0, 4, 6, 1},
{1, 2, 7, 6},
{5, 4, 6, 7}
};
ofColor color(ofRandom(255),ofRandom(255),ofRandom(255));
float hue = 254.f;
for (int i=0; i<8; ++i)
{
mesh.addVertex(ofVec3f( vdata[i][0], vdata[i][1], vdata[i][2] ));
mesh.addColor(color);
color.setHue(hue);
hue -= 20.f;
for (int i=0; i<6; ++i)
{
mesh.addIndex(indices[i][0]);
mesh.addIndex(indices[i][1]);
mesh.addIndex(indices[i][2]);
mesh.addIndex(indices[i][3]);
}
}
myVbo.setMesh(mesh, GL_STATIC_DRAW);
}
void cube::draw()
{
myVbo.drawElements(GL_QUADS, 24);
}
void cube::update()
{
}
testApp.h
#pragma once
#include "ofMain.h"
#include "cube.h"
class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
ofEasyCam camera;
cube *cube1;
cube *cube2;
cube *cube3;
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y);
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
};
testApp.cpp
#include "testApp.h"
//--------------------------------------------------------------
void testApp::setup()
{
glEnable(GL_DEPTH_TEST);
ofBackground(33, 33, 33);
cube1 = new cube(50, 100, 25);
cube2 = new cube(300, 50, 80);
cube3 = new cube(250, 160, 30);
}
//--------------------------------------------------------------
void testApp::update()
{
}
//--------------------------------------------------------------
void testApp::draw()
{
camera.begin();
cube1->draw();
ofPushMatrix();
ofTranslate(40, 60);
cube2->draw();
ofPopMatrix();
ofPushMatrix();
ofTranslate(80, 100);
cube3->draw();
ofPopMatrix();
}
/*other code*/
После расчесывания кода и тестирования других вещей я нашел исправление. Я просто уронил static
из GFloat
и GLint
. Я до сих пор не понимаю, почему, но это сработало.
Извините, я не могу оставлять комментарии, поскольку у меня недостаточно репутации. Я не смог найти ошибку в коде, читая, поэтому я быстро дал ей пробег в OF и, как вы можете видеть...
здесь нет проблем... Я бегу от 0.8 на VS2012Express - Win7 i7 nVidia Quatro 4000.
EDIT: может быть, это проблема с компилятором? У меня была такая проблема с аддонами, которые даже не могли компилироваться. Но это просто дикая догадка...
EDIT: Я только заметил, что антон ответил на свой вопрос, когда я наконец понял, почему это происходит. Я все еще не могу добавить комментарии, поэтому... Вещь в том, что значения static
переменных одинаковы для всех экземпляров класса. Для этого есть больше вещей, но, как правило, если вы изменяете статическую переменную (пусть говорят, static int width
) в одном объекте, во всех них будет происходить изменение.
И вот как это должно выглядеть :)