Example #1
0
//TODO: make bool and crash
bool RenderEngine::Draw(glm::mat4 perspective, glm::mat4 camera)
{
	
	GraphicalObject * currentGob = nullptr;// BufferManager::GetFirstGob();
	int objectNum = 0;
	
	RenderInfo * gobRenderInfo = nullptr;
	//SetAttributes();
	BufferGroup * bGroup = nullptr;

	//while(BufferManager::)

	

	while (BufferManager::GetBufferGroup(bGroup)) {

		if (bGroup == nullptr) { printf("RenderEngine::Draw(): bGroup is null\n"); return false; }

		int shaderInd = bGroup->GetShaderIndex();

		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		if (!ShaderManager::UseShader(shaderInd)) {
			printf("RenderEngine::Draw(): UseShader, shader [%d] does not exist\n", bGroup->GetShaderIndex());
			return false;
		}

		//if (shaderInd == 2)
		//{
		//	TextureManager::BindImage(0);
		//}

		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------
		//--------------------------------------------------------------------------------------------------


		GraphicalObject * bufferGroupGob = bGroup->GetFirstGob();
		if (bufferGroupGob != nullptr) {//{ printf("RenderEngine::Draw(): bufferGroupGob is null\n");  return false; }
			RenderInfo * renderInfo = bufferGroupGob->GetRenderInfoPtr();
			//Refactor

			//SetAttributes(bGroup);

			while (bGroup->GetBufferInfoGob(currentGob))
			{
				renderInfo = currentGob->GetRenderInfoPtr();
				glBindBuffer(GL_ARRAY_BUFFER, renderInfo->m_vertBufferID);
				glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, renderInfo->m_indBufferID);
				SetAttributes(&(renderInfo->m_vertexFormat), renderInfo->m_stride);

				//char * texInfo = TextureManager::GetData(0);

				while (currentGob != nullptr)
				{

					gobRenderInfo = currentGob->GetRenderInfoPtr();
					if (currentGob->GetRenderInfoPtr()->m_enabled) {
						glm::mat4 screenMat = perspective * (camera * /*Set this to a parameter ->*/(currentGob->GetTranslateMatrix() * (currentGob->GetRotationMatrix() * currentGob->GetScaleMatrix())));


						if (currentGob->m_drawCallback) {
							if (!currentGob->m_drawCallback(currentGob, screenMat)) return false;
						}
						else
						{
							if (shaderInd == 0) {
								SetUniformsShader0(currentGob, screenMat);
							}
							else if (shaderInd == 1) {
								if (!SetUniformsShader1(currentGob, screenMat)) return false;
							}
							else if (shaderInd == 2 || shaderInd == 3) {
								if (!SetUniformsShader2(currentGob, screenMat))return false;

							}
							else if (shaderInd == 4) {
								//glm::mat4 lightMat = perspective * (camera);

								if (!SetUniformsShader4(currentGob, screenMat)) return false;

							}
							else if (shaderInd == 5) {
								//glm::mat4 lightMat = perspective * (camera);

								if (!SetUniformsShader5(currentGob, screenMat)) return false;

							}
						}

						if (currentGob->GetRenderInfoPtr()->m_indexed) {

							DrawIndexedObject(currentGob);

						}
						else
						{

							DrawNonIndexedObject(currentGob);


						}
					}

					if (currentGob->m_drawCallback) {
						glDisable(GL_BLEND);
					}
					currentGob = currentGob->GetNextObjectPtr();

					objectNum++;
				}
			}
		}
	}
	return true;
}