2021-10-27 12:19:10 +00:00
|
|
|
#include "engine/renderer/shader.h"
|
2020-04-13 11:24:53 +00:00
|
|
|
|
2021-10-27 12:19:10 +00:00
|
|
|
#include "engine/renderer/renderer.h"
|
|
|
|
#include "engine/shader_source.h"
|
2020-04-13 11:24:53 +00:00
|
|
|
|
|
|
|
using namespace base;
|
|
|
|
|
|
|
|
namespace eng {
|
|
|
|
|
2021-10-25 20:54:57 +00:00
|
|
|
Shader::Shader(Renderer* renderer) : RenderResource(renderer) {}
|
2020-04-13 11:24:53 +00:00
|
|
|
|
|
|
|
Shader::~Shader() {
|
|
|
|
Destroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Shader::Create(std::unique_ptr<ShaderSource> source,
|
2020-09-17 22:03:21 +00:00
|
|
|
const VertexDescripton& vd,
|
2021-01-26 22:27:26 +00:00
|
|
|
Primitive primitive,
|
|
|
|
bool enable_depth_test) {
|
2020-04-13 11:24:53 +00:00
|
|
|
Destroy();
|
2021-10-25 20:54:57 +00:00
|
|
|
resource_id_ = renderer_->CreateShader(std::move(source), vd, primitive,
|
|
|
|
enable_depth_test);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Shader::Destroy() {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid()) {
|
|
|
|
renderer_->DestroyShader(resource_id_);
|
|
|
|
resource_id_ = 0;
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Shader::Activate() {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->ActivateShader(resource_id_);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
2021-02-18 14:42:08 +00:00
|
|
|
void Shader::SetUniform(const std::string& name, const Vector2f& v) {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->SetUniform(resource_id_, name, v);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
2021-02-18 14:42:08 +00:00
|
|
|
void Shader::SetUniform(const std::string& name, const Vector3f& v) {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->SetUniform(resource_id_, name, v);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
2021-02-18 14:42:08 +00:00
|
|
|
void Shader::SetUniform(const std::string& name, const Vector4f& v) {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->SetUniform(resource_id_, name, v);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
2021-02-18 14:42:08 +00:00
|
|
|
void Shader::SetUniform(const std::string& name, const Matrix4f& m) {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->SetUniform(resource_id_, name, m);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Shader::SetUniform(const std::string& name, float f) {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->SetUniform(resource_id_, name, f);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Shader::SetUniform(const std::string& name, int i) {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->SetUniform(resource_id_, name, i);
|
2020-09-17 22:03:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Shader::UploadUniforms() {
|
2021-10-25 20:54:57 +00:00
|
|
|
if (IsValid())
|
|
|
|
renderer_->UploadUniforms(resource_id_);
|
2020-04-13 11:24:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace eng
|