GfxContext::GfxContext() : m_TriangleProgram(nullptr) { // TODO: Shouldn't be done in here! Move to client's code! auto cubeGeom = LoadGeometryFromObj("resources\\cube.obj", "cube"); auto cube = shared_ptr<SceneObject>(new SceneObject()); auto cube2 = shared_ptr<SceneObject>(new SceneObject()); cube->Attributes.Geometry = cubeGeom; cube2->Attributes.Geometry = cubeGeom; cube2->Move(float3(0.0f, 3.0f, 0.0f)); m_Scene.Add(cube); m_Scene.Add(cube2); CShader* fShader = new CShader(GL_FRAGMENT_SHADER, "resources/shaders/mvp.frag"); CShader* vShader = new CShader(GL_VERTEX_SHADER, "resources/shaders/mvp.vert"); fShader->Compile(); vShader->Compile(); m_TriangleProgram = new CProgram(); m_TriangleProgram->Attach(fShader); m_TriangleProgram->Attach(vShader); m_TriangleProgram->Link(); m_Textures["grass"] = LoadTextureDDS("resources/textures/test-rgb8-256b.dds"); glEnable(GL_DEPTH_TEST); }
ERRCODE CRenderer::ProcessBufferQueue() { if(!queueMeshes->empty()) //В очереди ждет один или более мешей { //Пишем буферы меша (RAM) в видеопамять PAIR_UINT pair = vbContainer->Write(queueMeshes->front()->GetBuffer(BUFFER_V)->GetType(), queueMeshes->front()->GetBuffer(BUFFER_V)->GetSize(), queueMeshes->front()->GetBuffer(BUFFER_V)->GetBuffer()); PAIR_UINT indpair = vbContainer->Write(queueMeshes->front()->GetBuffer(BUFFER_I)->GetType(), queueMeshes->front()->GetBuffer(BUFFER_I)->GetSize(), queueMeshes->front()->GetBuffer(BUFFER_I)->GetBuffer()); //Записываем координаты данных в видеопамяти queueMeshes->front()->SetBufferCoords(BUFFER_V, pair.x, pair.y, queueMeshes->front()->GetBuffer(BUFFER_V)->GetSize()); queueMeshes->front()->SetBufferCoords(BUFFER_I, indpair.x, indpair.y, queueMeshes->front()->GetBuffer(BUFFER_I)->GetSize()); //Меш готов для рендера, записываем ссылку на него в массив мешей CMesh* msh = queueMeshes->front(); queueMeshes->pop(); vecMeshes->push_back(msh); //Удаляем указатель на меш из очереди char* str = new char[50]; sprintf(str, "Written vertex data into VBO\n"); Log(str); delete [] str; } if(!queueTextures2D->empty()) { //TODO: Сохранить текстуру в опенгл и отдать CTexture2D хендл(ID) на сохраненную текстуру CTexture2D* tex2D = queueTextures2D->front(); GLuint iT; glGenTextures(1, &iT); glBindTexture(GL_TEXTURE_2D, iT); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex2D->GetWidth(), tex2D->GetHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, tex2D->GetPixels()); glBindTexture(GL_TEXTURE_2D, 0); tex2D->SetTexture2Did(iT); queueTextures2D->pop(); vecTextures2D->push_back(tex2D); } if(!queueShaders->empty()) { CShader* shader = queueShaders->front(); //TODO: Компилируем шейдер, отправляем ID в CShader shader->Compile(); queueShaders->pop(); vecShaders->push_back(shader); Log("Compiled shader program.\n"); } return ERR_OK; }