Reworking shader compilation to not need reflection

This commit is contained in:
Dynamitos
2020-09-30 13:48:41 +02:00
parent facbfed79c
commit 79388bf41a
15 changed files with 330 additions and 4 deletions
+3
View File
@@ -19,3 +19,6 @@
[submodule "external/stb"]
path = external/stb
url = https://github.com/nothings/stb.git
[submodule "external/SPIRV-Cross"]
path = external/SPIRV-Cross
url = https://github.com/KhronosGroup/SPIRV-Cross.git
+50
View File
@@ -0,0 +1,50 @@
#
# Find SPIR-V Cross
#
# Try to find SPIR-V Cross library.
# This module defines the following variables:
# - SPIRV_INCLUDE_DIRS
# - SPIRV_LIBRARIES
# - SPIRV_FOUND
#
# The following variables can be set as arguments for the module.
# - SPIRV_ROOT : Root library directory of SPIR-V Cross
#
# References:
# - https://github.com/progschj/OpenGL-Examples/blob/master/cmake_modules/FindGLFW.cmake
# - https://bitbucket.org/Ident8/cegui-mk2-opengl3-renderer/src/befd47200265/cmake/FindGLFW.cmake
#
# Additional modules
include(FindPackageHandleStandardArgs)
find_path(SPIRV_INCLUDE_DIR
NAMES spirv.h
PATHS
${SPIRV_ROOT})
find_library(SPIRV_CORE_LIBRARY
NAMES spirv-cross-core${CMAKE_DEBUG_POSTFIX}
PATHS
${Seele_BINARY_DIR}/external/SPIRV-Cross)
find_library(SPIRV_GLSL_LIBRARY
NAMES spirv-cross-glsl${CMAKE_DEBUG_POSTFIX}
PATHS
${Seele_BINARY_DIR}/external/SPIRV-Cross)
find_library(SPIRV_REFLECT_LIBRARY
NAMES spirv-cross-reflect${CMAKE_DEBUG_POSTFIX}
PATHS
${Seele_BINARY_DIR}/external/SPIRV-Cross)
find_package_handle_standard_args(SPIRV DEFAULT_MSG SPIRV_CORE_LIBRARY SPIRV_GLSL_LIBRARY SPIRV_REFLECT_LIBRARY SPIRV_INCLUDE_DIR)
if(SPIRV_FOUND)
set(SPIRV_LIBRARIES ${SPIRV_CORE_LIBRARY} ${SPIRV_GLSL_LIBRARY} ${SPIRV_REFLECT_LIBRARY})
set(SPIRV_INCLUDE_DIRS ${SPIRV_INCLUDE_DIR})
endif()
mark_as_advanced(SPIRV_INCLUDE_DIR SPIRV_LIBRARY)
Vendored Submodule
+1
Submodule external/SPIRV-Cross added at ea3cd74426
+73
View File
@@ -0,0 +1,73 @@
#include "ShaderExpression.h"
#include "Graphics/GraphicsResources.h"
#include "Asset/TextureAsset.h"
using namespace Seele;
ShaderParameter::ShaderParameter(std::string name, uint32 byteOffset, uint32 binding)
: name(name)
, byteOffset(byteOffset)
, binding(binding)
{
}
ShaderParameter::~ShaderParameter()
{
}
FloatParameter::FloatParameter(std::string name, uint32 byteOffset, uint32 binding)
: ShaderParameter(name, byteOffset, binding)
{
}
FloatParameter::~FloatParameter()
{
}
void FloatParameter::updateDescriptorSet(Gfx::PDescriptorSet descriptorSet, uint8* dst)
{
std::memcpy(dst + byteOffset, &data, sizeof(float));
}
VectorParameter::VectorParameter(std::string name, uint32 byteOffset, uint32 binding)
: ShaderParameter(name, byteOffset, binding)
{
}
VectorParameter::~VectorParameter()
{
}
void VectorParameter::updateDescriptorSet(Gfx::PDescriptorSet descriptorSet, uint8* dst)
{
std::memcpy(dst + byteOffset, &data, sizeof(Vector));
}
TextureParameter::TextureParameter(std::string name, uint32 byteOffset, uint32 binding)
: ShaderParameter(name, byteOffset, binding)
{
}
TextureParameter::~TextureParameter()
{
}
void TextureParameter::updateDescriptorSet(Gfx::PDescriptorSet descriptorSet, uint8* dst)
{
descriptorSet->updateTexture(binding, data->getTexture());
}
SamplerParameter::SamplerParameter(std::string name, uint32 byteOffset, uint32 binding)
: ShaderParameter(name, byteOffset, binding)
{
}
SamplerParameter::~SamplerParameter()
{
}
void SamplerParameter::updateDescriptorSet(Gfx::PDescriptorSet descriptorSet, uint8* dst)
{
descriptorSet->updateSampler(binding, data);
}
+1 -1
View File
@@ -35,7 +35,7 @@ public:
PComponent getRootComponent();
void setRootComponent(PComponent newRoot);
private:
protected:
void setParent(PActor parent);
PScene owningScene;
PActor parent;
+3 -1
View File
@@ -1,4 +1,6 @@
target_sources(SeeleEngine
PRIVATE
Actor.cpp
Actor.h)
Actor.h
CameraActor.cpp
CameraActor.h)
+21
View File
@@ -0,0 +1,21 @@
#include "CameraActor.h"
#include "Scene/Components/Component.h"
#include "Scene/Components/CameraComponent.h"
using namespace Seele;
CameraActor::CameraActor()
{
sceneComponent = new Component();
setRootComponent(sceneComponent);
cameraComponent = new CameraComponent();
cameraComponent->fieldOfView = 70.0f;
cameraComponent->aspectRatio = 1.777778f;
cameraComponent->setParent(sceneComponent);
cameraComponent->setOwner(this);
}
CameraActor::~CameraActor()
{
}
+21
View File
@@ -0,0 +1,21 @@
#pragma once
#include "Actor.h"
namespace Seele
{
DECLARE_REF(CameraComponent)
class CameraActor : public Actor
{
public:
CameraActor();
virtual ~CameraActor();
PCameraComponent getCameraComponent() const
{
return cameraComponent;
}
private:
PCameraComponent cameraComponent;
PComponent sceneComponent; // This will be the root, camera will be the child
};
DEFINE_REF(CameraActor);
} // namespace Seele
@@ -1,5 +1,7 @@
target_sources(SeeleEngine
PRIVATE
CameraComponent.h
CameraComponent.cpp
Component.h
Component.cpp
PrimitiveComponent.cpp
@@ -0,0 +1,69 @@
#include "CameraComponent.h"
#include <algorithm>
using namespace Seele;
CameraComponent::CameraComponent()
: bNeedsProjectionBuild(true)
, bNeedsViewBuild(true)
, originPoint(0, 0, 0)
, cameraPosition(0, 0, 0)
{
distance = 50;
rotationX = 0;
rotationY = -0.5f;
}
CameraComponent::~CameraComponent()
{
}
void CameraComponent::mouseMove(float deltaX, float deltaY)
{
//0.01 mouse sensitivity
rotationX += deltaX/100.f;
rotationY += deltaY/100.f;
rotationY = std::clamp(rotationY, -1.5f, 1.5f);
bNeedsViewBuild = true;
}
void CameraComponent::mouseScroll(double x)
{
distance += static_cast<float>(x);
distance = std::max(distance, 1.f);
bNeedsViewBuild = true;
}
void CameraComponent::moveOrigin(float up)
{
originPoint.y += up;
bNeedsViewBuild = true;
}
void CameraComponent::buildViewMatrix()
{
Matrix4 rotation = glm::rotate(Matrix4(), rotationX, Vector(0, 1, 0));
rotation = glm::rotate(rotation, rotationY, Vector(1, 0, 0));
Vector4 translation(0, 0, distance, 1);
translation = rotation * translation;
cameraPosition = originPoint + Vector(translation);
viewMatrix = glm::lookAt(cameraPosition, originPoint, Vector(0, 1, 0));
bNeedsViewBuild = false;
}
void CameraComponent::buildProjectionMatrix()
{
projectionMatrix = glm::perspective(fieldOfView, aspectRatio, 1.0f, 1000.f);
static Matrix4 correctionMatrix =
Matrix4(
Vector4(1, 0, 0, 0),
Vector4(0, 1, 0, 0),
Vector4(0, 0, 0.5f, 0),
Vector4(0, 0, 0.5f, 1));
projectionMatrix = correctionMatrix * projectionMatrix;
bNeedsProjectionBuild = false;
}
@@ -0,0 +1,52 @@
#pragma once
#include "Component.h"
#include "Math/Matrix.h"
namespace Seele
{
class CameraComponent : public Component
{
public:
CameraComponent();
virtual ~CameraComponent();
Matrix4 getViewMatrix()
{
if (bNeedsViewBuild)
{
buildViewMatrix();
}
return viewMatrix;
}
Matrix4 getProjectionMatrix()
{
if (bNeedsProjectionBuild)
{
buildProjectionMatrix();
}
return projectionMatrix;
}
void mouseMove(float deltaX, float deltaY);
void mouseScroll(double x);
void moveOrigin(float up);
float aspectRatio;
float fieldOfView;
private:
bool bNeedsViewBuild;
bool bNeedsProjectionBuild;
void buildViewMatrix();
void buildProjectionMatrix();
float rotationX;
float rotationY;
float distance;
Vector eye;
Vector originPoint;
Vector cameraPosition;
//Transforms relative to actor
Matrix4 viewMatrix;
Matrix4 projectionMatrix;
};
DEFINE_REF(CameraComponent);
} // namespace Seele
@@ -124,6 +124,11 @@ void Component::setParent(PComponent newParent)
parent = newParent;
}
void Component::setOwner(PActor newOwner)
{
owner = newOwner;
}
void Component::internalSetTransform(Vector newLocation, Quaternion newRotation)
{
if (parent != nullptr)
+2 -1
View File
@@ -15,6 +15,8 @@ public:
void tick(float deltaTime);
PComponent getParent();
PActor getOwner();
void setParent(PComponent parent);
void setOwner(PActor owner);
virtual void notifySceneAttach(PScene scene);
void setWorldLocation(Vector location);
@@ -34,7 +36,6 @@ public:
Transform getTransform() const;
private:
void setParent(PComponent parent);
void internalSetTransform(Vector newLocation, Quaternion newRotation);
void propagateTransformUpdate();
void updateComponentTransform(Quaternion relativeRotationQuat);
@@ -17,7 +17,7 @@ PrimitiveComponent::PrimitiveComponent(PMeshAsset asset)
for (uint32 i = 0; i < assetMeshes.size(); i++)
{
auto& batch = staticMeshes[i];
batch.material = assetMeshes[i]->referencedMaterial->getRenderMaterial();
batch.material = assetMeshes[i]->referencedMaterial;
batch.isBackfaceCullingDisabled = false;
batch.isCastingShadow = true;
batch.primitiveComponent = this;
+26
View File
@@ -10,6 +10,30 @@ namespace Seele
{
DECLARE_REF(Material);
struct DirectionalLight
{
Vector4 color;
Vector4 direction;
Vector4 intensity;
};
struct PointLight
{
Vector4 positionWS;
Vector4 positionVS;
Vector4 colorRange;
};
#define MAX_DIRECTIONAL_LIGHTS 4
#define MAX_POINT_LIGHTS 256
struct LightEnv
{
DirectionalLight directionalLights[MAX_DIRECTIONAL_LIGHTS];
PointLight pointLights[MAX_POINT_LIGHTS];
uint32 numDirectionalLgiths;
uint32 numPointLights;
};
class Scene
{
public:
@@ -21,10 +45,12 @@ public:
const Array<PPrimitiveComponent>& getPrimitives() const { return primitives; }
const Array<MeshBatch>& getStaticMeshes() const { return staticMeshes; }
const LightEnv& getLightEnvironment() const { return lightEnv; }
private:
Array<MeshBatch> staticMeshes;
Array<PActor> rootActors;
Array<PPrimitiveComponent> primitives;
LightEnv lightEnv;
Gfx::PGraphics graphics;
};
} // namespace Seele