Testing textures and events
This commit is contained in:
@ -21,8 +21,11 @@ float_t BackBufferRenderTarget::getHeight() {
|
||||
}
|
||||
|
||||
void BackBufferRenderTarget::setSize(float_t width, float_t height) {
|
||||
if(this->width == width && this->height == height) return;
|
||||
|
||||
this->width = width;
|
||||
this->height = height;
|
||||
this->eventRenderTargetResized.invoke(*this, width, height);
|
||||
}
|
||||
|
||||
void BackBufferRenderTarget::setClearColor(struct Color color) {
|
||||
|
@ -9,6 +9,7 @@ target_sources(${DAWN_TARGET_NAME}
|
||||
RenderManager.cpp
|
||||
BackBufferRenderTarget.cpp
|
||||
StandardRenderPipeline.cpp
|
||||
Texture.cpp
|
||||
)
|
||||
|
||||
# Subdirs
|
||||
|
76
src/dawnopengl/display/Texture.cpp
Normal file
76
src/dawnopengl/display/Texture.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
// Copyright (c) 2022 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#include "Texture.hpp"
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
void Texture::bind(textureslot_t slot) {
|
||||
if(this->id == -1) throw "Texture has not been initialized, cannot bind.";
|
||||
glActiveTexture(GL_TEXTURE0 + slot);
|
||||
glBindTexture(GL_TEXTURE_2D, this->id);
|
||||
}
|
||||
|
||||
int32_t Texture::getWidth() {
|
||||
return this->width;
|
||||
}
|
||||
|
||||
int32_t Texture::getHeight() {
|
||||
return this->height;
|
||||
}
|
||||
|
||||
void Texture::setSize(int32_t width, int32_t height) {
|
||||
if(this->id != -1) glDeleteTextures(1, &this->id);
|
||||
|
||||
this->width = width;
|
||||
this->height = height;
|
||||
|
||||
glGenTextures(1, &this->id);
|
||||
if(this->id <= 0) throw "Texture generation failed!";
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, this->id);
|
||||
|
||||
// Setup our preferred texture params, later this will be configurable.
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
// Initialize the texture to blank
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D, 0, GL_RGBA,
|
||||
width, height,
|
||||
0, GL_RGBA, GL_FLOAT, NULL
|
||||
);
|
||||
}
|
||||
|
||||
void Texture::fill(struct Color color) {
|
||||
struct Color *pixels = (struct Color *)memoryAllocate(
|
||||
sizeof(struct Color) * this->width * this->height
|
||||
);
|
||||
|
||||
this->buffer(pixels);
|
||||
|
||||
memoryFree(pixels);
|
||||
}
|
||||
|
||||
bool_t Texture::isReady() {
|
||||
return this->id != -1;
|
||||
}
|
||||
|
||||
void Texture::buffer(struct Color pixels[]) {
|
||||
glBindTexture(GL_TEXTURE_2D, this->id);
|
||||
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D, 0, GL_RGBA,
|
||||
this->width, this->height,
|
||||
0, GL_RGBA, GL_FLOAT, (void *)pixels
|
||||
);
|
||||
}
|
||||
|
||||
Texture::~Texture() {
|
||||
if(this->id != -1) glDeleteTextures(1, &this->id);
|
||||
}
|
32
src/dawnopengl/display/Texture.hpp
Normal file
32
src/dawnopengl/display/Texture.hpp
Normal file
@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2022 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "dawnopengl.hpp"
|
||||
#include "display/_Texture.hpp"
|
||||
#include "util/memory.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
typedef GLuint textureslot_t;
|
||||
|
||||
class Texture : public ITexture {
|
||||
private:
|
||||
int32_t width = -1;
|
||||
int32_t height = -1;
|
||||
GLuint id = -1;
|
||||
|
||||
public:
|
||||
void bind(textureslot_t slot);
|
||||
|
||||
int32_t getWidth() override;
|
||||
int32_t getHeight() override;
|
||||
void setSize(int32_t width, int32_t height) override;
|
||||
void fill(struct Color) override;
|
||||
bool_t isReady() override;
|
||||
void buffer(struct Color pixels[]) override;
|
||||
|
||||
~Texture();
|
||||
};
|
||||
}
|
@ -7,5 +7,4 @@
|
||||
target_sources(${DAWN_TARGET_NAME}
|
||||
PRIVATE
|
||||
Mesh.cpp
|
||||
TriangleMesh.cpp
|
||||
)
|
@ -80,10 +80,15 @@ namespace Dawn {
|
||||
int32_t position,
|
||||
std::array<glm::vec2, N> coordinates
|
||||
) {
|
||||
auto offsetCoordinates = (
|
||||
(sizeof(glm::vec3) * this->verticeCount) +
|
||||
(sizeof(glm::vec2) * position)
|
||||
);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, this->vertexBuffer);
|
||||
glBufferSubData(
|
||||
GL_ARRAY_BUFFER,
|
||||
sizeof(glm::vec2) * position,
|
||||
offsetCoordinates,
|
||||
sizeof(coordinates),
|
||||
(void *)coordinates.data()
|
||||
);
|
||||
|
@ -1,26 +0,0 @@
|
||||
// Copyright (c) 2022 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#include "display/mesh/Mesh.hpp"
|
||||
#include "display/mesh/TriangleMesh.hpp"
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
void TriangleMesh::createTriangleMesh(Mesh &mesh) {
|
||||
mesh.createBuffers(3, 3);
|
||||
mesh.bufferPositions(0, std::array<glm::vec3, 3>{{
|
||||
glm::vec3(-1, 0, 0),
|
||||
glm::vec3(0, 1, 0),
|
||||
glm::vec3(1, 0, 0)
|
||||
}});
|
||||
mesh.bufferCoordinates(0, std::array<glm::vec2, 3>{{
|
||||
glm::vec2(0, 0),
|
||||
glm::vec2(0, 1),
|
||||
glm::vec2(1, 0)
|
||||
}});
|
||||
mesh.bufferIndices(0, std::array<meshindice_t,3>{{
|
||||
0, 1, 2
|
||||
}});
|
||||
}
|
@ -61,6 +61,10 @@ void Shader::compileShader(
|
||||
// Now parse out the variables.
|
||||
}
|
||||
|
||||
void Shader::setTextureSlot(shaderparameter_t param, textureslot_t slot) {
|
||||
glUniform1i(param, slot);
|
||||
}
|
||||
|
||||
shaderparameter_t Shader::getParameterByName(std::string name) {
|
||||
return glGetUniformLocation(this->shaderProgram, name.c_str());
|
||||
}
|
||||
@ -81,6 +85,13 @@ void Shader::setVector3(shaderparameter_t uniform, glm::vec3 vector) {
|
||||
glUniform3f(uniform, vector.x, vector.y, vector.z);
|
||||
}
|
||||
|
||||
void Shader::setTexture(
|
||||
shaderparameter_t param,
|
||||
std::shared_ptr<Texture> texture
|
||||
) {
|
||||
this->bindTexture(param, texture);
|
||||
}
|
||||
|
||||
void Shader::bind() {
|
||||
if(this->shaderProgram == -1) throw "Shader has not yet been compiled";
|
||||
glUseProgram(this->shaderProgram);
|
||||
|
@ -32,6 +32,29 @@ namespace Dawn {
|
||||
*/
|
||||
void compileShader(std::string vertexShader, std::string fragmentShader);
|
||||
|
||||
/**
|
||||
* Bind a specific texture slot (of an already bound texture) to a shader
|
||||
* parameter.
|
||||
*
|
||||
* @param param Parameter to bind the texture slot for.
|
||||
* @param slot Slot to bind.
|
||||
*/
|
||||
void setTextureSlot(shaderparameter_t param, textureslot_t slot);
|
||||
|
||||
/**
|
||||
* Method designed to be overwritten by child shaders on how to handle a
|
||||
* bind texture request. This is left to the discretion of the child
|
||||
* shader for which slot(s) to use, how to handle nullptr textures, etc.
|
||||
*
|
||||
* @param param Parameter to bind the requested texture to.
|
||||
* @param texture Texture trying to be bound, may be nullptr.
|
||||
*/
|
||||
virtual void bindTexture(
|
||||
shaderparameter_t param,
|
||||
std::shared_ptr<Texture> texture
|
||||
) = 0;
|
||||
|
||||
|
||||
public:
|
||||
/**
|
||||
* Locate a shader parameter by its name.
|
||||
@ -52,6 +75,10 @@ namespace Dawn {
|
||||
void setBoolean(shaderparameter_t parameter, bool_t value) override;
|
||||
void setColor(shaderparameter_t parameter, struct Color color) override;
|
||||
void setVector3(shaderparameter_t parameter, glm::vec3 vector) override;
|
||||
void setTexture(
|
||||
shaderparameter_t parameter,
|
||||
std::shared_ptr<Texture> texture
|
||||
) override;
|
||||
|
||||
/**
|
||||
* Destroys and deletes the shader from the GPU.
|
||||
|
@ -24,7 +24,7 @@ namespace Dawn {
|
||||
|
||||
ps[this->paramColor] = SHADER_PARAMETER_TYPE_COLOR;
|
||||
ps[this->paramHasTexture] = SHADER_PARAMETER_TYPE_BOOLEAN;
|
||||
// ps[paramTexture] SHADER_PARAMETER_TYPE_TEXTURE;
|
||||
ps[this->paramTexture] = SHADER_PARAMETER_TYPE_TEXTURE;
|
||||
|
||||
return ps;
|
||||
}
|
||||
@ -42,6 +42,19 @@ namespace Dawn {
|
||||
this->setMatrix(this->paramModel, transform);
|
||||
}
|
||||
|
||||
void bindTexture(
|
||||
shaderparameter_t param,
|
||||
std::shared_ptr<Texture> texture
|
||||
) override {
|
||||
if(texture == nullptr) {
|
||||
this->setBoolean(this->paramHasTexture, false);
|
||||
} else {
|
||||
this->setBoolean(this->paramHasTexture, true);
|
||||
this->setTextureSlot(param, 0x00);
|
||||
texture->bind(0x00);
|
||||
}
|
||||
}
|
||||
|
||||
void compile() override {
|
||||
this->compileShader(
|
||||
// Vertex Shader
|
||||
|
Reference in New Issue
Block a user