Skip to content

Commit

Permalink
now can import basic material (color and parameters)
Browse files Browse the repository at this point in the history
  • Loading branch information
netwarm007 committed Dec 14, 2017
1 parent 61da4f0 commit 161ca18
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 14 deletions.
Binary file not shown.
File renamed without changes.
Binary file modified External/Darwin/bin/ispc
Binary file not shown.
7 changes: 7 additions & 0 deletions Framework/Common/SceneNode.hpp
Expand Up @@ -124,6 +124,13 @@ namespace My {
using SceneNode::AddSceneObjectRef;
void AddMaterialRef(const std::string& key) { m_Materials.push_back(key); };
void AddMaterialRef(const std::string&& key) { m_Materials.push_back(std::move(key)); };
std::string GetMaterialRef(const size_t index)
{
if (index < m_Materials.size())
return m_Materials[index];
else
return std::string();
};
};

class SceneLightNode : public SceneNode<SceneObjectLight>
Expand Down
112 changes: 102 additions & 10 deletions Framework/Common/SceneObject.hpp
Expand Up @@ -178,6 +178,7 @@ namespace My {
SceneObjectIndexArray(SceneObjectIndexArray& arr) = default;
SceneObjectIndexArray(SceneObjectIndexArray&& arr) = default;

const uint32_t GetMaterialIndex() const { return m_nMaterialIndex; };
const IndexDataType GetIndexType() const { return m_DataType; };
const void* GetData() const { return m_pData; };
size_t GetDataSize() const
Expand Down Expand Up @@ -284,7 +285,7 @@ namespace My {

public:
SceneObjectTexture() : BaseSceneObject(SceneObjectType::kSceneObjectTypeTexture), m_nTexCoordIndex(0) {};
SceneObjectTexture(std::string& name) : BaseSceneObject(SceneObjectType::kSceneObjectTypeTexture), m_Name(name), m_nTexCoordIndex(0) {};
SceneObjectTexture(const std::string& name) : BaseSceneObject(SceneObjectType::kSceneObjectTypeTexture), m_Name(name), m_nTexCoordIndex(0) {};
SceneObjectTexture(uint32_t coord_index, std::shared_ptr<Image>& image) : BaseSceneObject(SceneObjectType::kSceneObjectTypeTexture), m_nTexCoordIndex(coord_index), m_pImage(image) {};
SceneObjectTexture(uint32_t coord_index, std::shared_ptr<Image>&& image) : BaseSceneObject(SceneObjectType::kSceneObjectTypeTexture), m_nTexCoordIndex(coord_index), m_pImage(std::move(image)) {};
SceneObjectTexture(SceneObjectTexture&) = default;
Expand Down Expand Up @@ -344,38 +345,129 @@ namespace My {
Parameter m_Metallic;
Parameter m_Roughness;
Normal m_Normal;
Parameter m_Specular;
Color m_Specular;
Parameter m_SpecularPower;
Parameter m_AmbientOcclusion;
Color m_Opacity;
Color m_Transparency;
Color m_Emission;

public:
SceneObjectMaterial(const std::string& name) : BaseSceneObject(SceneObjectType::kSceneObjectTypeMaterial), m_Name(name) {};
SceneObjectMaterial(std::string&& name) : BaseSceneObject(SceneObjectType::kSceneObjectTypeMaterial), m_Name(std::move(name)) {};
SceneObjectMaterial(void) : BaseSceneObject(SceneObjectType::kSceneObjectTypeMaterial), m_Name(""), m_BaseColor(Vector4f(1.0f)), m_Metallic(0.0f), m_Roughness(0.0f), m_Normal(Vector3f(0.0f, 0.0f, 1.0f)), m_Specular(0.0f), m_AmbientOcclusion(1.0f) {};
SceneObjectMaterial(void)
: BaseSceneObject(SceneObjectType::kSceneObjectTypeMaterial),
m_Name(""),
m_BaseColor(Vector4f(1.0f)),
m_Metallic(0.0f),
m_Roughness(0.0f),
m_Normal(Vector3f(0.0f, 0.0f, 1.0f)),
m_Specular(0.0f),
m_SpecularPower(1.0f),
m_AmbientOcclusion(1.0f),
m_Opacity(1.0f),
m_Transparency(0.0f),
m_Emission(0.0f) {};
SceneObjectMaterial(const std::string& name) : SceneObjectMaterial()
{ m_Name = name; };
SceneObjectMaterial(std::string&& name) : SceneObjectMaterial()
{ m_Name = std::move(name); };

const std::string& GetName() const { return m_Name; };
const Color& GetBaseColor() const { return m_BaseColor; };
const Color& GetSpecularColor() const { return m_Specular; };
const Parameter& GetSpecularPower() const { return m_SpecularPower; };
void SetName(const std::string& name) { m_Name = name; };
void SetName(std::string&& name) { m_Name = std::move(name); };
void SetColor(std::string& attrib, Vector4f& color)
void SetColor(const std::string& attrib, const Vector4f& color)
{
if(attrib == "deffuse") {
if(attrib == "diffuse") {
m_BaseColor = Color(color);
}

if(attrib == "specular") {
m_Specular = Color(color);
}

if(attrib == "emission") {
m_Emission = Color(color);
}

if(attrib == "opacity") {
m_Opacity = Color(color);
}

if(attrib == "transparency") {
m_Transparency = Color(color);
}
};

void SetParam(std::string& attrib, float param)
void SetParam(const std::string& attrib, const float param)
{

if(attrib == "specular_power") {
m_SpecularPower = Parameter(param);
}
};

void SetTexture(std::string& attrib, std::string& textureName)
void SetTexture(const std::string& attrib, const std::string& textureName)
{
if(attrib == "diffuse") {
m_BaseColor = std::make_shared<SceneObjectTexture>(textureName);
}

if(attrib == "specular") {
m_Specular = std::make_shared<SceneObjectTexture>(textureName);
}

if(attrib == "specular_power") {
m_SpecularPower = std::make_shared<SceneObjectTexture>(textureName);
}

if(attrib == "emission") {
m_Emission = std::make_shared<SceneObjectTexture>(textureName);
}

if(attrib == "opacity") {
m_Opacity = std::make_shared<SceneObjectTexture>(textureName);
}

if(attrib == "transparency") {
m_Transparency = std::make_shared<SceneObjectTexture>(textureName);
}

if(attrib == "normal") {
m_Normal = std::make_shared<SceneObjectTexture>(textureName);
}
};

void SetTexture(std::string& attrib, std::shared_ptr<SceneObjectTexture>& texture)
void SetTexture(const std::string& attrib, const std::shared_ptr<SceneObjectTexture>& texture)
{
if(attrib == "diffuse") {
m_BaseColor = texture;
}

if(attrib == "specular") {
m_Specular = texture;
}

if(attrib == "specular_power") {
m_SpecularPower = texture;
}

if(attrib == "emission") {
m_Emission = texture;
}

if(attrib == "opacity") {
m_Opacity = texture;
}

if(attrib == "transparency") {
m_Transparency = texture;
}

if(attrib == "normal") {
m_Normal = texture;
}
};

friend std::ostream& operator<<(std::ostream& out, const SceneObjectMaterial& obj);
Expand Down
50 changes: 47 additions & 3 deletions RHI/OpenGL/OpenGLGraphicsManager.cpp
Expand Up @@ -5,8 +5,8 @@
#include "IApplication.hpp"
#include "SceneManager.hpp"

const char VS_SHADER_SOURCE_FILE[] = "Shaders/basic.vs";
const char PS_SHADER_SOURCE_FILE[] = "Shaders/basic.ps";
const char VS_SHADER_SOURCE_FILE[] = "Shaders/basic_vs.glsl";
const char PS_SHADER_SOURCE_FILE[] = "Shaders/basic_ps.glsl";

using namespace My;
using namespace std;
Expand Down Expand Up @@ -230,7 +230,7 @@ bool OpenGLGraphicsManager::SetPerFrameShaderParameters()
return true;
}

bool OpenGLGraphicsManager::SetPerBatchShaderParameters(const char* paramName, float* param)
bool OpenGLGraphicsManager::SetPerBatchShaderParameters(const char* paramName, const Matrix4X4f& param)
{
unsigned int location;

Expand All @@ -244,9 +244,39 @@ bool OpenGLGraphicsManager::SetPerBatchShaderParameters(const char* paramName, f
return true;
}

bool OpenGLGraphicsManager::SetPerBatchShaderParameters(const char* paramName, const Vector3f& param)
{
unsigned int location;

location = glGetUniformLocation(m_shaderProgram, paramName);
if(location == -1)
{
return false;
}
glUniform3fv(location, 1, param);

return true;
}

bool OpenGLGraphicsManager::SetPerBatchShaderParameters(const char* paramName, const float param)
{
unsigned int location;

location = glGetUniformLocation(m_shaderProgram, paramName);
if(location == -1)
{
return false;
}
glUniform1f(location, param);

return true;
}

void OpenGLGraphicsManager::InitializeBuffers()
{
auto& scene = g_pSceneManager->GetSceneForRendering();

// Geometries
auto pGeometryNode = scene.GetFirstGeometryNode();
while (pGeometryNode)
{
Expand Down Expand Up @@ -384,12 +414,16 @@ void OpenGLGraphicsManager::InitializeBuffers()

m_Buffers.push_back(buffer_id);

size_t material_index = index_array.GetMaterialIndex();
std::string material_key = pGeometryNode->GetMaterialRef(material_index);

DrawBatchContext& dbc = *(new DrawBatchContext);
dbc.vao = vao;
dbc.mode = mode;
dbc.type = type;
dbc.counts.push_back(indexCount);
dbc.transform = pGeometryNode->GetCalculatedTransform();
dbc.material = scene.GetMaterial(material_key);
m_DrawBatchContext.push_back(std::move(dbc));
}
}
Expand Down Expand Up @@ -424,6 +458,16 @@ void OpenGLGraphicsManager::RenderBuffers()
// Set the color shader as the current shader program and set the matrices that it will use for rendering.
glUseProgram(m_shaderProgram);
SetPerBatchShaderParameters("modelMatrix", *dbc.transform);
if (dbc.material) {
Color color = dbc.material->GetBaseColor();
SetPerBatchShaderParameters("defuseColor", color.Value.rgb);

color = dbc.material->GetSpecularColor();
SetPerBatchShaderParameters("specularColor", color.Value.rgb);

Parameter param = dbc.material->GetSpecularPower();
SetPerBatchShaderParameters("specularPower", param.Value);
}

glBindVertexArray(dbc.vao);

Expand Down
6 changes: 5 additions & 1 deletion RHI/OpenGL/OpenGLGraphicsManager.hpp
Expand Up @@ -6,6 +6,7 @@
#include <string>
#include <memory>
#include "glad/glad.h"
#include "SceneObject.hpp"

namespace My {
class OpenGLGraphicsManager : public GraphicsManager
Expand All @@ -21,7 +22,9 @@ namespace My {
virtual void Draw();

private:
bool SetPerBatchShaderParameters(const char* paramName, float* param);
bool SetPerBatchShaderParameters(const char* paramName, const Matrix4X4f& param);
bool SetPerBatchShaderParameters(const char* paramName, const Vector3f& param);
bool SetPerBatchShaderParameters(const char* paramName, const float param);
bool SetPerFrameShaderParameters();

void InitializeBuffers();
Expand Down Expand Up @@ -49,6 +52,7 @@ namespace My {
GLenum type;
std::vector<GLsizei> counts;
std::shared_ptr<Matrix4X4f> transform;
std::shared_ptr<SceneObjectMaterial> material;
};

DrawFrameContext m_DrawFrameContext;
Expand Down

0 comments on commit 161ca18

Please sign in to comment.