Попытка сделать мир меш, который я могу изменить по желанию C++ OpenGL

Итак, у меня есть проект, который я пытаюсь построить. Моя цель - получить список GL_QUADS, который содержит мою структуру уровней. По сути, я хочу иметь возможность добавлять и удалять кубы из списка, а затем сделать его OpenGL.

Моя проблема в том, что массивы не кажутся расширяемыми. Я уже написал код, который позволяет мне нажимать пробел и создавать куб, однако мне нужно каким-то образом создать массив точек, который создает куб длиннее по желанию. Поэтому, если есть способ расширять массивы по мере необходимости, я весь в ушах.

Вот часть кода... вам не нужно даже смотреть на него, чтобы ответить на вопрос. Я sudo закодировал несоответствующие разделы.

#include <GLTools.h>    
#include <GLMatrixStack.h>
#include <GLFrame.h>
#include <GLFrustum.h>
#include <GLBatch.h>
#include <GLGeometryTransform.h>

#include <math.h>
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif


// An assortment of needed classes
GLShaderManager     shaderManager;
GLMatrixStack       modelViewMatrix;
GLMatrixStack       projectionMatrix;
GLFrame             cameraFrame;
GLFrame             objectFrame;
GLFrustum           viewFrustum;


GLBatch             triangleBatch;
GLBatch             QuadStrip;

GLGeometryTransform transformPipeline;
M3DMatrix44f        shadowMatrix;


GLfloat vGreen[] = { 0.5f, 1.0f, 0.0f, 1.0f };


 GLfloat vPyramid[12][3] = { //COORDS};




//This function is triggered when space is pressed.  It takes parameters passed to it to create the 8 points of the cube then makes a Quad_Strip mesh from it
void CreatePlat(float centerx, float centery, float centerz, float width, float length, float depth)
{

    GLfloat vP1[3] = { (centerx - (width/2)), (centery), (centerz + (length/2))}; //top left
    GLfloat vP2[3] = { (centerx + (width/2)), (centery), (centerz + (length/2))}; //top right
    GLfloat vP3[3] = { (centerx + (width/2)), (centery),(centerz - (length/2))}; //bottom right
    GLfloat vP4[3] = { (centerx - (width/2)), (centery), (centerz - (length/2))}; //bottom left
    GLfloat vP5[3] = { (centerx - (width/2)), (centery - depth), (centerz + (length/2))};
    GLfloat vP6[3] = { (centerx + (width/2)), (centery - depth), (centerz + (length/2))};
    GLfloat vP7[3] = { (centerx + (width/2)), (centery - depth),(centerz - (length/2))};
    GLfloat vP8[3] = { (centerx - (width/2)), (centery - depth), (centerz - (length/2))};



    GLfloat vPlat[26][3] = {vP4[0], vP4[1], vP4[2],
        //BLA BLA
        vP2[0], vP2[1], vP2[2]};


    QuadStrip.Begin(GL_QUAD_STRIP, 26);
    QuadStrip.CopyVertexData3f(vPlat);
    QuadStrip.End();


}

GLfloat size = 1.0;


void Update ()
{

    //Controls

    //Rotate controls

    if(space)
        CreatePlat(0.0, 0.0, 0.0, size, 1.0, 1.0);
    if(W)
        size += 1.0;
    if(S)
        size -= 1.0;

    vPyramid[1][1] += 1.0;
}


void SetupRC()
    {
    triangleBatch.Begin(GL_TRIANGLES, 12);
    triangleBatch.CopyVertexData3f(vPyramid);
    triangleBatch.End();

    }


void DrawWireFramedBatch(GLBatch* pBatch)
    {
           //Take a mesh and draw it WITH outlines
    }

void RenderScene(void)
    {    
        Update();
        // Clear the window with current clearing color
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

        modelViewMatrix.PushMatrix();
        M3DMatrix44f mCamera;
        cameraFrame.GetCameraMatrix(mCamera);
        modelViewMatrix.MultMatrix(mCamera);

        M3DMatrix44f mObjectFrame;
        objectFrame.GetMatrix(mObjectFrame);
        modelViewMatrix.MultMatrix(mObjectFrame);

        shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);


        DrawWireFramedBatch(&triangleBatch);
        DrawWireFramedBatch(&QuadStrip);

        modelViewMatrix.PopMatrix();
        glutPostRedisplay();

        // Flush drawing commands
        glutSwapBuffers();
    }


int main(int argc, char* argv[])
    {
    gltSetWorkingDirectory(argv[0]);

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("GL_POINTS");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    //glutSpecialFunc(SpecialKeys);

    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
        }


    SetupRC();

    glutMainLoop();
    return 0;
    }

Как вы можете видеть, желаемое решение должно быть внутри функции CreatePlat() после создания строк, чтобы добавить строки в массив, а затем перестроить мой буфер, чтобы он соответствовал ему. Также вы можете заметить, что в настоящее время я использую Quad_Strip.... Я буду использовать GL_Quads.

Примечание: я планирую делать движение на основе скорости сорта, я знаком с математикой того, как иметь дело с ориентацией в 2D, если вы пытаетесь добавить различные величины горизонтальной и вертикальной скорости.... Однако в 3D IDK! Я буду в состоянии настроить вещи, чтобы они отлично работали, до тех пор, пока игрок не начнет вращаться, и тогда все станет сложнее. Это для чего-то важного?

1 ответ

Я думаю, что вы должны использовать VBO вместо QuadStrip и визуализировать его с помощью базовой шейдерной программы. Это может немного ускорить вашу программу и даст вам больше свободы.

Другие вопросы по тегам