bool testDrawArrays::render()
{
	glm::vec2 const WindowSize(this->getWindowSize());

	float Depth(1.0f);
	glClearBufferfv(GL_DEPTH, 0, &Depth);
	glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f)[0]);

	{
		glBindBuffer(GL_UNIFORM_BUFFER, this->BufferName[buffer::BUFFER_FRAME]);
		glm::mat4* Pointer = reinterpret_cast<glm::mat4*>(glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));

		glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, WindowSize.x / WindowSize.y, 0.1f, 1000.0f);
		glm::mat4 View = this->view();
		glm::mat4 Model = glm::mat4(1.0f);
		glm::mat4 MVP = Projection * View * Model;

		*Pointer = Projection * View * Model;
		glUnmapBuffer(GL_UNIFORM_BUFFER);
	}

	glViewportIndexedfv(0, &glm::vec4(0, 0, WindowSize)[0]);

	this->beginTimer();
	switch(this->DrawType)
	{
	case INSTANCED:
		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, static_cast<GLsizei>(DrawCount), 0);
		break;
	case MULTI_DISCARD:
	case MULTI_DRAW:
		for(int i = 0; i < 2; ++i)
			glMultiDrawArraysIndirect(GL_TRIANGLES, 0, static_cast<GLsizei>(DrawCount / 2), 0);
		break;
	case DRAW_PACKED:
		for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex)
		{
			if(this->UniformUpdate != testDrawArrays::CONSTANT_UNIFORM && this->UniformUpdate != testDrawArrays::NO_UNIFORM)
				::updateUniform(this->ProgramName, DrawIndex, this->UniformUpdate);
			glDrawArrays(GL_TRIANGLES, static_cast<GLint>(this->VertexDataType == SEPARATED_VERTEX_DATA ? VertexCount * DrawIndex : 0), VertexCount);
		}
		break;
	case DRAW_PARAMS:
		for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex)
		{
			if(this->UniformUpdate != testDrawArrays::CONSTANT_UNIFORM && this->UniformUpdate != testDrawArrays::NO_UNIFORM)
				::updateUniform(this->ProgramName, DrawIndex, this->UniformUpdate);
			glDrawArraysInstancedBaseInstance(GL_TRIANGLES, static_cast<GLint>(this->VertexDataType == SEPARATED_VERTEX_DATA ? VertexCount * DrawIndex : 0), VertexCount, 1, 0);
		}
		break;
	default:
		assert(0);
		break;
	}
	this->endTimer();

	return true;
}
示例#2
0
文件: Help.cpp 项目: rurudo/moguru
//描画処理
void Help::Draw(void)
{
	DataManager &data = DataManager::GetInstance();
	GameInput &input = GameInput::GetInstance();

	if(m_Exist)
	{
		//BG
		DXLibMath::DrawRotaGraphResize(	0.5f, 0.5f, 1.0f, 0.0f, 
										DataManager::GetInstance().Get(DataManager::Help_BG), TRUE);
		switch(m_State)
		{
		case INDEX:
			DrawIndex();
			break;
		case REFERENCE:
			DrawReference();
			break;
		}
		//閉じるボタン
		DXLibMath::DrawRotaGraphResize(0.97f, 0.035f, m_Help_Button_Scale, 0.0f, data.Get(DataManager::Help_Button_Close), TRUE);
	}
	else
		DXLibMath::DrawRotaGraphResize(0.97f, 0.035f, m_Help_Button_Scale, 0.0f, data.Get(DataManager::Play_UI_Play_HelpButton), TRUE);
}
void testDrawIndexing::render()
{
    float Depth(1.0f);
    glClearBufferfv(GL_DEPTH, 0, &Depth);
    glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f)[0]);

    {
        glBindBuffer(GL_UNIFORM_BUFFER, this->BufferName[buffer::BUFFER_FRAME]);
        glm::mat4* Pointer = reinterpret_cast<glm::mat4*>(glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));

        glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 2048.0f);
        glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -this->TranlationCurrent.y - 512));
        glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, this->RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
        glm::mat4 View = glm::rotate(ViewRotateX, this->RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
        glm::mat4 Model = glm::mat4(1.0f);

        *Pointer = Projection * View * Model;
        glUnmapBuffer(GL_UNIFORM_BUFFER);
    }

    glViewportIndexedfv(0, &glm::vec4(0, 0, this->getWindowSize())[0]);

    this->beginTimer();
    switch(this->Indexing)
    {
    case DRAW:
    case DIVISOR_MULTI_INDEXING:
    case ID_INDEXING:
    {
        int const DrawChunk = 2;
        for(int i = 0; i < DrawChunk; ++i)
            glMultiDrawArraysIndirect(GL_TRIANGLES, 0, static_cast<GLsizei>(DrawCount / DrawChunk), 0);
    }
    case DIVISOR_INDEXING:
    {
        for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex)
            glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, static_cast<GLuint>(DrawIndex));
    }
    break;
    case ATTRIB_INDEXING:
    {
        for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex)
        {
            glVertexAttribI1i(1, DrawIndex % 2 ? 0 : 1); // 1 is DRAW_ID attribute location
            glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, 0);
        }
    }
    break;
    case UNIFORM_INDEXING:
    {
        for(std::size_t DrawIndex(0); DrawIndex < DrawCount; ++DrawIndex)
        {
            glProgramUniform1i(this->ProgramName, UniformDrawIndex, DrawIndex % 2 ? 0 : 1);
            glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, 0);
        }
    }
    break;
    default:
        assert(0);
        break;
    }
    this->endTimer();
}