/*************************************************************//**
     *
     *  @brief  描画処理を行う
     *  @param  なし
     *  @return なし
     *
     ****************************************************************/
    void C_SpriteCreater::Draw()
    {
        // 頂点の書き換え
        pPointDatas_->RewriteVertices(vertices_.data(), drawSpriteCount_);

        // シェーダーの使用開始
        pGlslObject_->Begin();

        // サブルーチンを設定
        pGlslObject_->BindActiveSubroutine(subroutineIndices_[cameraType_], Shader::GLSL::Type::s_GEOMETRY);
        
        // ユニフォーム変数を設定
        SetUniformVariable();

        // テクスチャマネージャーとOpenGLマネージャーを取得
        auto pTextureManager = Texture::C_TextureManager::s_GetInstance();
        auto pOpenGlManager = OpenGL::C_OpenGlManager::s_GetInstance();

        // ブレンドを有効化し、ブレンドに使用する関数を設定
        pOpenGlManager->EnableBlend(true);
        pOpenGlManager->SetBlendFunction(sourceFactor_, destinationFactor_);

        // カリングを無効化
        pOpenGlManager->EnableCulling(false);

        // 深度のマスクを有効化
        pOpenGlManager->EnableDepthMask(true);

        // アクティブなテクスチャユニットを設定し、テクスチャをバインド
        pTextureManager->SetActiveUnit(Fixed::Texture::s_UNIT_NUMBER);
        pTextureManager->Bind(Texture::Type::s_2D, pTextureData_->handle_);

        // スプライトを描画
        pOpenGlManager->DrawPrimitive(OpenGL::Primitive::s_POINT, pPointDatas_->GetVertexArrayObjectHandle(), drawSpriteCount_);

        // 深度のマスクを無効化
        pOpenGlManager->EnableDepthMask(false);

        // カリングを有効化
        pOpenGlManager->EnableCulling(true);

        // ブレンドを無効化
        pOpenGlManager->EnableBlend(false);

        // テクスチャをアンバインド
        pTextureManager->Unbind(Texture::Type::s_2D);

        // シェーダーの使用終了
        pGlslObject_->End();

        drawSpriteCount_ = 0;
    }
void TerrainRenderer::Draw(const std::vector<Terrain*>& terrains, Vector4 clipPlane) {
    EnableCulling(true);

    shader->Bind();
    shader->SetUniformMatrix4fv("gCamera", camera->GetTransform()->GetMatrix());
    shader->SetUniform3f("eyeWorldPosition", camera->GetTransform()->GetPosition());
    shader->SetUniform4f("clipPlane", clipPlane);

    for (unsigned int i = 0; i < terrains.size(); ++i) {
        shader->SetUniformMatrix4fv("gWorld", terrains[i]->GetWorldMatrix());

        RawModel* model = terrains[i]->GetTexturedModel()->GetRawModel();
        Texture* texture = terrains[i]->GetTexturedModel()->GetTexture();
        texture->Bind();

        model->GetVertexArray()->Bind();
        model->GetIndexBuffer()->Bind();

        glDrawElements(GL_TRIANGLES, model->GetIndexBuffer()->GetCount(), GL_UNSIGNED_INT, 0);

        model->GetIndexBuffer()->Unbind();
        model->GetVertexArray()->Unbind();

        texture->Unbind();
    }

    shader->Unbind();
}
void WaterRenderer::Draw(const std::vector<Water*>& waters) {
	EnableCulling(true);

	moveFactor += moveSpeed * TimeFrame::deltaTime;
	moveFactor = fmod(moveFactor, 1.0f);

	shader->Bind();
	shader->SetUniformMatrix4fv("gCamera", camera->GetTransform()->GetMatrix());
	shader->SetUniform3f("cameraPosition", camera->GetTransform()->GetPosition());
	shader->SetUniform1f("moveFactor", moveFactor);

	waterFrameBuffer->GetReflectionTexture()->Bind(0);
	waterFrameBuffer->GetRefractionTexture()->Bind(1);
	dudvTexture->Bind(2);

	for (unsigned int i = 0; i < waters.size(); ++i) {
		shader->SetUniformMatrix4fv("gWorld", waters[i]->GetWorldMatrix());

		RawModel* model = waters[i]->GetModel();
		model->GetVertexArray()->Bind();
		model->GetIndexBuffer()->Bind();

		glDrawElements(GL_TRIANGLES, model->GetIndexBuffer()->GetCount(), GL_UNSIGNED_INT, 0);

		model->GetIndexBuffer()->Unbind();
		model->GetVertexArray()->Unbind();
	}

	waterFrameBuffer->GetReflectionTexture()->Unbind();
	waterFrameBuffer->GetRefractionTexture()->Unbind();
	dudvTexture->Unbind();

	shader->Unbind();
}
void RenderSystem::v_Render()
{

	BeginScene();

	m_Matrix.view = m_Camera.GetViewMatrix();

	DisableZbuffer();
	DisableCulling();

	m_Matrix.view._14 = 0.0f;
	m_Matrix.view._24 = 0.0f;
	m_Matrix.view._34 = 0.0f;
	m_Matrix.view._41 = 0.0f;
	m_Matrix.view._42 = 0.0f;
	m_Matrix.view._43 = 0.0f;
	XMMATRIX sphereWorld = XMMatrixIdentity();
	XMStoreFloat4x4(&m_Matrix.model, XMMatrixTranspose(sphereWorld));
	m_Skymap.Render(m_pD3D11DeviceContext, m_Matrix);

	EnableCulling();
	EnableZbuffer();


	m_Matrix.view = m_Camera.GetViewMatrix();
	XMMATRIX gridModel = XMMatrixIdentity();
	XMStoreFloat4x4(&m_Matrix.model, XMMatrixTranspose(gridModel));
	m_Terrain.Render(m_pD3D11DeviceContext, m_Matrix);

	DrawInfo();

	EndScene();

}