void opengl_texture_state::Delete(GLuint tex_id)
{
	if (tex_id == 0) {
		Int3();
		return;
	}

	GLuint atu_save = active_texture_unit;

	for (unsigned int i = 0; i < num_texture_units; i++) {
		if (units[i].texture_id == tex_id) {
			SetActiveUnit(i);

			glBindTexture(units[i].texture_target, 0);
			units[i].texture_id = 0;

			default_values(i, units[i].texture_target);

			if (i == atu_save) {
				atu_save = 0;
			}
		}
	}

	SetActiveUnit(atu_save);
}
예제 #2
0
void opengl_texture_state::DisableAll()
{
	for (unsigned int i = 0; i < num_texture_units; i++) {
		if (units[i].active) {
			SetActiveUnit(i);
			Disable();
		}
	}

	SetActiveUnit();

	Current_texture_source = TEXTURE_SOURCE_NONE;
}
예제 #3
0
    /*************************************************************//**
     *
     *  @brief  非公開の描画処理を行う
     *  @param  なし
     *  @return なし
     *
     ****************************************************************/
    void C_SmallBeamOption::DoDraw()
    {
        pGlslObject_->BeginWithUnifomBuffer(pUniformBuffer_->GetHandle(), uniformBlockIndex_);
        pGlslObject_->BindActiveSubroutine(cameraSubroutineIndex_, Shader::GLSL::Type::s_VERTEX);

        upRigidBody_->GetTransform().getOpenGLMatrix(modelMatrix_.a_);
        modelMatrix_ = modelMatrix_ * Matrix4x4::s_CreateScaling(Vector3(radius_));
        pGlslObject_->SetUniformMatrix4x4("u_modelMatrix", modelMatrix_);

        // ライトとマテリアルを設定
        SetLight(pMainLight_);
        SetMaterial(pNowMaterial_);

        auto pOpenGlManager = OpenGL::C_OpenGlManager::s_GetInstance();
        auto pTextureManager = Texture::C_TextureManager::s_GetInstance();

        // アクティブなテクスチャユニットを設定し、テクスチャをバインド
        pTextureManager->SetActiveUnit(0);
        pModelTextureData_ = Texture::C_TextureManager::s_GetInstance()->GetTextureData(Path::Texture::s_pSMALL_BEAM_OPTION).get();
        pTextureManager->Bind(Texture::Type::s_2D, pModelTextureData_->handle_);

        pOpenGlManager->DrawPrimitiveWithIndices(OpenGL::Primitive::s_TRIANGLE,
                                                 pModelData_->GetVertexArrayObjectHandle(), 
                                                 pModelData_->GetIndexBufferObjectHandle(),
                                                 OpenGL::DataType::s_UNSIGNED_SHORT,
                                                 static_cast<int32_t>(pModelData_->GetIndexCount()));

        pTextureManager->Unbind(Texture::Type::s_2D);

        pGlslObject_->End();
    }
예제 #4
0
void opengl_texture_state::DisableUnused()
{
	for (unsigned int i = 0; i < num_texture_units; i++) {
		if (!units[i].used) {
			SetActiveUnit(i);
			Disable();
		}
	}
}
예제 #5
0
    /*************************************************************//**
     *
     *  @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 opengl_texture_state::Enable(GLuint unit, GLenum tex_target, GLuint tex_id) {
	Assertion(unit < num_texture_units, "Invalid texture unit value!");

	if (units[unit].texture_target == tex_target && units[unit].texture_id == tex_id) {
		// The texture unit already uses this texture. There is no need to change it
		return;
	}

	// Go the standard route
	SetActiveUnit(unit);
	SetTarget(tex_target);
	Enable(tex_id);
}
void opengl_texture_state::init(GLuint n_units)
{
	Assert( n_units > 0 );
	units = (opengl_texture_unit*) vm_malloc(n_units * sizeof(opengl_texture_unit));
	num_texture_units = n_units;

	for (unsigned int unit = 0; unit < num_texture_units; unit++) {
		units[unit].enabled = GL_FALSE;

		default_values(unit);

		glActiveTexture(GL_TEXTURE0 + unit);
	}

	SetActiveUnit();
}