realised im basically just implementing the PGE so ill just use that instead
This commit is contained in:
83
legacy/src/framebuffer.cpp
Normal file
83
legacy/src/framebuffer.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
#include "framebuffer.hpp"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||
#include "thirdparty/stb_image_write.h"
|
||||
|
||||
FrameBuffer::FrameBuffer( int width, int height )
|
||||
: mWidth(width)
|
||||
, mHeight(height)
|
||||
{
|
||||
|
||||
size_t size = sizeof( uint32_t ) * mWidth * mHeight;
|
||||
|
||||
Data = (uint32_t*)malloc( size );
|
||||
|
||||
// Initialise the framebuffer
|
||||
if ( Data != nullptr )
|
||||
memset( Data, 0xFFFFFFFF, size );
|
||||
}
|
||||
|
||||
void FrameBuffer::SetPixel( int x, int y, glm::vec3 p )
|
||||
{
|
||||
int i = y * mWidth + x;
|
||||
const static float gamma = 1.0f / 2.2f;
|
||||
uint8_t r = (uint8_t)( pow( p.r, gamma ) * 255.0f );
|
||||
uint8_t g = (uint8_t)( pow( p.g, gamma ) * 255.0f );
|
||||
uint8_t b = (uint8_t)( pow( p.b, gamma ) * 255.0f );
|
||||
uint32_t col = r << 24 | g << 16 | b << 8 | 0xFF;
|
||||
Data[i] = col;
|
||||
}
|
||||
|
||||
void FrameBuffer::Resize( int width, int height )
|
||||
{
|
||||
mWidth = width; mHeight = height;
|
||||
|
||||
size_t size = sizeof( uint32_t ) * mWidth * mHeight;
|
||||
|
||||
realloc( Data, size );
|
||||
memset( Data, 0xFFFFFFFF, size );
|
||||
}
|
||||
|
||||
void FrameBuffer::DumpToFile( std::string file )
|
||||
{
|
||||
// int stbi_write_png(char const* filename, int w, int h, int comp, const void* data, int stride_in_bytes);
|
||||
struct P {
|
||||
unsigned char r, g, b, a;
|
||||
};
|
||||
|
||||
P* imageData = (P*)malloc( ( (int)mWidth * (int)mHeight ) * sizeof( P ) );
|
||||
|
||||
for ( int x = 0; x < mWidth; x++ )
|
||||
for ( int y = 0; y < mHeight; y++ ) {
|
||||
// Red and Blue channels need to be swapped, no clue why
|
||||
// saving the framebuffer just doesnt work
|
||||
|
||||
//nvm it just doesnt work
|
||||
uint32_t pixel = Data[y * mWidth + x];
|
||||
uint8_t er = ( pixel & 0x0000FF00 );
|
||||
uint8_t eg = ( pixel & 0x00FF0000 ) >> 8;
|
||||
uint8_t eb = ( pixel & 0xFF0000FF ) >> 16;
|
||||
|
||||
imageData[y * mWidth + x] = P{ (unsigned char)er, (unsigned char)eg, (unsigned char)eb, 0xFF };
|
||||
}
|
||||
|
||||
stbi_write_png( file.c_str(), mWidth, mHeight, sizeof( P ), imageData, sizeof( P ) * mWidth );
|
||||
free( imageData );
|
||||
}
|
||||
|
||||
int FrameBuffer::GetWidth()
|
||||
{
|
||||
return mWidth;
|
||||
}
|
||||
|
||||
int FrameBuffer::GetHeight()
|
||||
{
|
||||
return mHeight;
|
||||
}
|
||||
|
||||
FrameBuffer::~FrameBuffer()
|
||||
{
|
||||
free( Data );
|
||||
}
|
||||
Reference in New Issue
Block a user