mirror of
https://github.com/jmarshall23/CnC_Remastered_Collection.git
synced 2026-08-12 16:10:54 +02:00
137 lines
3.1 KiB
C++
137 lines
3.1 KiB
C++
// RenderTexture.cpp
|
|
//
|
|
|
|
#include "function.h"
|
|
#include "image.h"
|
|
#include "gl/glew.h"
|
|
|
|
/*
|
|
========================
|
|
RenderTexture::RenderTexture
|
|
========================
|
|
*/
|
|
RenderTexture::RenderTexture(Image_t *colorImage, Image_t *depthImage) {
|
|
deviceHandle = -1;
|
|
if (colorImage != nullptr)
|
|
{
|
|
AddRenderImage(colorImage);
|
|
}
|
|
this->depthImage = depthImage;
|
|
}
|
|
|
|
/*
|
|
========================
|
|
RenderTexture::~RenderTexture
|
|
========================
|
|
*/
|
|
RenderTexture::~RenderTexture() {
|
|
if (deviceHandle != -1)
|
|
{
|
|
glDeleteFramebuffers(1, &deviceHandle);
|
|
deviceHandle = -1;
|
|
}
|
|
}
|
|
/*
|
|
================
|
|
RenderTexture::AddRenderImage
|
|
================
|
|
*/
|
|
void RenderTexture::AddRenderImage(Image_t *image) {
|
|
if (deviceHandle != -1) {
|
|
assert(!"RenderTexture::AddRenderImage: Can't add render image after FBO has been created!");
|
|
}
|
|
|
|
colorImages.push_back(image);
|
|
}
|
|
|
|
/*
|
|
================
|
|
RenderTexture::InitRenderTexture
|
|
================
|
|
*/
|
|
void RenderTexture::InitRenderTexture(void) {
|
|
glGenFramebuffers(1, &deviceHandle);
|
|
glBindFramebuffer(GL_FRAMEBUFFER, deviceHandle);
|
|
|
|
for (int i = 0; i < colorImages.size(); i++) {
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, colorImages[i]->HouseImages[0].image[0][0], 0);
|
|
}
|
|
|
|
if (depthImage != nullptr) {
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthImage->HouseImages[0].image[0][0], 0);
|
|
}
|
|
|
|
if (colorImages.size() > 0)
|
|
{
|
|
GLenum DrawBuffers[5] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4 };
|
|
if (colorImages.size() >= 5) {
|
|
assert(!"InitRenderTextures: Too many render targets!");
|
|
}
|
|
glDrawBuffers(colorImages.size(), &DrawBuffers[0]);
|
|
}
|
|
|
|
|
|
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
|
assert(!"RenderTexture::InitRenderTexture: Failed to create rendertexture!");
|
|
}
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
}
|
|
|
|
/*
|
|
================
|
|
RenderTexture::MakeCurrent
|
|
================
|
|
*/
|
|
void RenderTexture::MakeCurrent(void) {
|
|
glBindFramebuffer(GL_FRAMEBUFFER, deviceHandle);
|
|
}
|
|
|
|
/*
|
|
================
|
|
RenderTexture::BindNull
|
|
================
|
|
*/
|
|
void RenderTexture::BindNull(void) {
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
}
|
|
|
|
int RenderTexture::GetWidth() const { return (colorImages.size() > 0) ? colorImages[0]->renderwidth[0] : depthImage->renderwidth[0]; }
|
|
int RenderTexture::GetHeight() const { return (colorImages.size() > 0) ? colorImages[0]->renderheight[0] : depthImage->renderheight[0]; }
|
|
|
|
/*
|
|
================
|
|
RenderTexture::Resize
|
|
================
|
|
*/
|
|
void RenderTexture::Resize(int width, int height) {
|
|
//Image_t *target = nullptr;
|
|
//
|
|
//if (colorImages.Num() > 0) {
|
|
// target = colorImages[0];
|
|
//}
|
|
//else {
|
|
// target = depthImage;
|
|
//}
|
|
//
|
|
//if (target->GetOpts().width == width && target->GetOpts().height == height) {
|
|
// return;
|
|
//}
|
|
//
|
|
//for(int i = 0; i < colorImages.Num(); i++) {
|
|
// colorImages[i]->Resize(width, height);
|
|
//}
|
|
//
|
|
//if (depthImage != nullptr) {
|
|
// depthImage->Resize(width, height);
|
|
//}
|
|
//
|
|
//if (deviceHandle != -1)
|
|
//{
|
|
// glDeleteFramebuffers(1, &deviceHandle);
|
|
// deviceHandle = -1;
|
|
//}
|
|
//
|
|
//InitRenderTexture();
|
|
}
|