Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b1a59e0ed2 | |||
| b3038ef713 | |||
| f161fce719 | |||
| 89d0d5753f |
@@ -24,6 +24,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
Octree<EntityAABB>* m_Octree;
|
Octree<EntityAABB>* m_Octree;
|
||||||
std::vector<EntityAABB> m_OctreeResult;
|
std::vector<EntityAABB> m_OctreeResult;
|
||||||
|
std::unordered_map<EntityWrapper, glm::vec3> m_PrevPositions;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -21,6 +21,8 @@ public:
|
|||||||
std::string GetFileName() const;
|
std::string GetFileName() const;
|
||||||
GLuint GetHandle() const;
|
GLuint GetHandle() const;
|
||||||
bool IsCompiled() const;
|
bool IsCompiled() const;
|
||||||
|
static std::string ReadFile(std::string fileName);
|
||||||
|
private:
|
||||||
protected:
|
protected:
|
||||||
GLenum m_ShaderType;
|
GLenum m_ShaderType;
|
||||||
std::string m_FileName;
|
std::string m_FileName;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
<Physics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Physics.xsd">
|
<Physics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Physics.xsd">
|
||||||
<Velocity X="0" Y="0" Z="0"/>
|
<Velocity X="0" Y="0" Z="0"/>
|
||||||
<Gravity>true</Gravity>
|
<Gravity>true</Gravity>
|
||||||
<PrevOrigin X="-9876.5" Y="-9876.5" Z="-9876.5"/>
|
|
||||||
<IsOnGround>false</IsOnGround>
|
<IsOnGround>false</IsOnGround>
|
||||||
<VerticalStepHeight>0.33</VerticalStepHeight>
|
<VerticalStepHeight>0.33</VerticalStepHeight>
|
||||||
</Physics>
|
</Physics>
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
<xs:annotation><xs:documentation>m/s^2</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>m/s^2</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="Gravity" type="t:bool" minOccurs="0"/>
|
<xs:element name="Gravity" type="t:bool" minOccurs="0"/>
|
||||||
<xs:element name="PrevOrigin" type="t:Vector" minOccurs="0"/>
|
|
||||||
<xs:element name="IsOnGround" type="t:bool" minOccurs="0"/>
|
<xs:element name="IsOnGround" type="t:bool" minOccurs="0"/>
|
||||||
<xs:element name="VerticalStepHeight" type="t:double" minOccurs="0">
|
<xs:element name="VerticalStepHeight" type="t:double" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>The largest height of a "stair-step" that can be walked over</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>The largest height of a "stair-step" that can be walked over</xs:documentation></xs:annotation>
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
<c:DashAbility/>
|
<c:DashAbility/>
|
||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:Physics>
|
<c:Physics>
|
||||||
<PrevOrigin X="0" Y="0.772000015" Z="0"/>
|
|
||||||
<Velocity X="2.30999646e-23" Y="0" Z="1.05272533e-23"/>
|
<Velocity X="2.30999646e-23" Y="0" Z="1.05272533e-23"/>
|
||||||
</c:Physics>
|
</c:Physics>
|
||||||
<c:Player>
|
<c:Player>
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
<c:DashAbility/>
|
<c:DashAbility/>
|
||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:Physics>
|
<c:Physics>
|
||||||
<PrevOrigin X="0" Y="0.772000015" Z="0"/>
|
|
||||||
<Velocity X="2.30999646e-23" Y="0" Z="1.05272533e-23"/>
|
<Velocity X="2.30999646e-23" Y="0" Z="1.05272533e-23"/>
|
||||||
</c:Physics>
|
</c:Physics>
|
||||||
<c:Player>
|
<c:Player>
|
||||||
|
|||||||
@@ -116,12 +116,7 @@ LightResult CalcDirectionalLightSource(vec4 direction, vec4 color, float intensi
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textureCoordinate, sampler2D normalMap)
|
#include "Shaders/Util/CommonUniforms.glsl"
|
||||||
{
|
|
||||||
mat3 TBN = mat3(tangent, bitangent, normal);
|
|
||||||
vec3 NormalMap = texture(normalMap, textureCoordinate).xyz * 2.0 - vec3(1.0);
|
|
||||||
return vec4(TBN * normalize(NormalMap), 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
@@ -180,6 +175,7 @@ void main()
|
|||||||
color_result += FillColor;
|
color_result += FillColor;
|
||||||
}
|
}
|
||||||
sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1));
|
sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1));
|
||||||
|
//sceneColor = CommonUniforms.testColour;
|
||||||
//sceneColor = vec4(reflectionColor.xyz, 1);
|
//sceneColor = vec4(reflectionColor.xyz, 1);
|
||||||
color_result += glowTexel*GlowIntensity;
|
color_result += glowTexel*GlowIntensity;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textureCoordinate, sampler2D normalMap)
|
||||||
|
{
|
||||||
|
mat3 TBN = mat3(tangent, bitangent, normal);
|
||||||
|
vec3 NormalMap = texture(normalMap, textureCoordinate).xyz * 2.0 - vec3(1.0);
|
||||||
|
return vec4(TBN * normalize(NormalMap), 0.0);
|
||||||
|
}
|
||||||
@@ -16,51 +16,51 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
|||||||
EntityAABB& boxA = *boundingBox;
|
EntityAABB& boxA = *boundingBox;
|
||||||
bool everHitTheGround = false;
|
bool everHitTheGround = false;
|
||||||
|
|
||||||
glm::vec3 size = boxA.Size();
|
auto prevPosIt = m_PrevPositions.find(entity);
|
||||||
float diameter = std::min(size.x, size.z);
|
if (prevPosIt != m_PrevPositions.end()) {
|
||||||
glm::vec3 prevOrigin = (glm::vec3)cPhysics["PrevOrigin"];
|
glm::vec3 size = boxA.Size();
|
||||||
glm::vec3 toCurrentPos = boxA.Origin() - prevOrigin;
|
float diameter = std::min(size.x, size.z);
|
||||||
float rayLength = glm::length(toCurrentPos) + 0.5f*diameter;
|
glm::vec3 prevOrigin = prevPosIt->second;
|
||||||
//If the entity has moved farther than the size of its box, we need to handle it specially.
|
glm::vec3 toCurrentPos = boxA.Origin() - prevOrigin;
|
||||||
bool traceCollision = rayLength > diameter;
|
float rayLength = glm::length(toCurrentPos) + 0.5f*diameter;
|
||||||
//hack solution: If prevOrigin is less than -9000 in all dimensions,
|
//If the entity has moved farther than the size of its box, we need to handle it specially.
|
||||||
//then it means it is not set, i.e. this is the first collision check for the entity.
|
if (rayLength > diameter) {
|
||||||
if (traceCollision && glm::any(glm::greaterThan((glm::vec3)cPhysics["PrevOrigin"], glm::vec3(-9000.f)))) {
|
Ray ray(prevOrigin, toCurrentPos);
|
||||||
Ray ray(prevOrigin, toCurrentPos);
|
m_OctreeResult.clear();
|
||||||
m_OctreeResult.clear();
|
m_Octree->ObjectsPossiblyHitByRay(ray, m_OctreeResult);
|
||||||
m_Octree->ObjectsPossiblyHitByRay(ray, m_OctreeResult);
|
for (auto& boxB : m_OctreeResult) {
|
||||||
for (auto& boxB : m_OctreeResult) {
|
if (boxA.Entity == boxB.Entity) {
|
||||||
if (boxA.Entity == boxB.Entity) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
bool hit;
|
|
||||||
float dist;
|
|
||||||
if (boxB.Entity.HasComponent("Model")) {
|
|
||||||
RawModel* model;
|
|
||||||
std::string res = (std::string)boxB.Entity["Model"]["Resource"];
|
|
||||||
try {
|
|
||||||
model = ResourceManager::Load<RawModel, true>(res);
|
|
||||||
} catch (const std::exception&) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
float u, v;
|
bool hit;
|
||||||
hit = Collision::RayVsModel(ray, model->Vertices(), model->m_Indices, Transform::ModelMatrix(boxB.Entity), dist, u, v);
|
float dist;
|
||||||
} else {
|
if (boxB.Entity.HasComponent("Model")) {
|
||||||
hit = Collision::RayVsAABB(ray, boxB, dist);
|
RawModel* model;
|
||||||
}
|
std::string res = (std::string)boxB.Entity["Model"]["Resource"];
|
||||||
if (hit && dist < rayLength) {
|
try {
|
||||||
//Set the entity to where it was colliding, minus the maximum box size.
|
model = ResourceManager::Load<RawModel, true>(res);
|
||||||
//TODO: Perhaps this should be done slightly more properly.
|
} catch (const std::exception&) {
|
||||||
glm::vec3 newOriginPos = ray.Origin() + (dist - 0.707107f*diameter) * ray.Direction();
|
continue;
|
||||||
glm::vec3 resolve = newOriginPos - boxA.Origin();
|
}
|
||||||
(glm::vec3&)cTransform["Position"] += resolve;
|
float u, v;
|
||||||
boxA = *Collision::EntityAbsoluteAABB(entity);
|
hit = Collision::RayVsModel(ray, model->Vertices(), model->m_Indices, Transform::ModelMatrix(boxB.Entity), dist, u, v);
|
||||||
if (resolve.y > 0) {
|
} else {
|
||||||
everHitTheGround = true;
|
hit = Collision::RayVsAABB(ray, boxB, dist);
|
||||||
(bool)cPhysics["IsOnGround"] = true;
|
}
|
||||||
((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
|
if (hit && dist < rayLength) {
|
||||||
|
//Set the entity to where it was colliding, minus the maximum box size.
|
||||||
|
//TODO: Perhaps this should be done slightly more properly.
|
||||||
|
glm::vec3 newOriginPos = ray.Origin() + (dist - 0.707107f*diameter) * ray.Direction();
|
||||||
|
glm::vec3 resolve = newOriginPos - boxA.Origin();
|
||||||
|
(glm::vec3&)cTransform["Position"] += resolve;
|
||||||
|
boxA = *Collision::EntityAbsoluteAABB(entity);
|
||||||
|
if (resolve.y > 0) {
|
||||||
|
everHitTheGround = true;
|
||||||
|
(bool)cPhysics["IsOnGround"] = true;
|
||||||
|
((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,6 +90,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
|||||||
float verticalStepHeight = (float)(double)cPhysics["VerticalStepHeight"];
|
float verticalStepHeight = (float)(double)cPhysics["VerticalStepHeight"];
|
||||||
if (Collision::AABBvsTriangles(boxA, model->Vertices(), model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
|
if (Collision::AABBvsTriangles(boxA, model->Vertices(), model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
|
||||||
(glm::vec3&)cTransform["Position"] += resolutionVector;
|
(glm::vec3&)cTransform["Position"] += resolutionVector;
|
||||||
|
boxA = *Collision::EntityAbsoluteAABB(entity);
|
||||||
cPhysics["Velocity"] = inOutVelocity;
|
cPhysics["Velocity"] = inOutVelocity;
|
||||||
if (isOnGround) {
|
if (isOnGround) {
|
||||||
everHitTheGround = true;
|
everHitTheGround = true;
|
||||||
@@ -99,6 +100,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
|||||||
} else if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) {
|
} else if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) {
|
||||||
//Enter here if boxB has no Model.
|
//Enter here if boxB has no Model.
|
||||||
(glm::vec3&)cTransform["Position"] += resolutionVector;
|
(glm::vec3&)cTransform["Position"] += resolutionVector;
|
||||||
|
boxA = *Collision::EntityAbsoluteAABB(entity);
|
||||||
if (resolutionVector.y > 0) {
|
if (resolutionVector.y > 0) {
|
||||||
everHitTheGround = true;
|
everHitTheGround = true;
|
||||||
(bool)cPhysics["IsOnGround"] = true;
|
(bool)cPhysics["IsOnGround"] = true;
|
||||||
@@ -112,5 +114,5 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
|||||||
(bool)cPhysics["IsOnGround"] = false;
|
(bool)cPhysics["IsOnGround"] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
(glm::vec3&)cPhysics["PrevOrigin"] = boxA.Origin();
|
m_PrevPositions[entity] = boxA.Origin();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,22 +4,32 @@ GLuint Shader::CompileShader(GLenum shaderType, std::string fileName)
|
|||||||
{
|
{
|
||||||
LOG_INFO("Compiling shader \"%s\"", fileName.c_str());
|
LOG_INFO("Compiling shader \"%s\"", fileName.c_str());
|
||||||
|
|
||||||
std::string shaderFile;
|
std::string shaderFile = ReadFile(fileName);
|
||||||
std::ifstream in(fileName, std::ios::in);
|
|
||||||
if (!in) {
|
|
||||||
LOG_ERROR("Error: Failed to open shader file \"%s\"", fileName.c_str());
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
in.seekg(0, std::ios::end);
|
|
||||||
shaderFile.resize((int)in.tellg());
|
|
||||||
in.seekg(0, std::ios::beg);
|
|
||||||
in.read(&shaderFile[0], shaderFile.size());
|
|
||||||
in.close();
|
|
||||||
|
|
||||||
GLuint shader = glCreateShader(shaderType);
|
GLuint shader = glCreateShader(shaderType);
|
||||||
if (GLERROR("glCreateShader"))
|
if (GLERROR("glCreateShader"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
std::size_t startPos = 0;
|
||||||
|
std::size_t SEofNewFile[2];
|
||||||
|
std::string key = "#include";
|
||||||
|
while((startPos = shaderFile.find(key, startPos)) != std::string::npos)
|
||||||
|
{
|
||||||
|
SEofNewFile[0] = shaderFile.find('"', startPos+key.length())+1;
|
||||||
|
SEofNewFile[1] = shaderFile.find('"', SEofNewFile[0]);
|
||||||
|
if (SEofNewFile[0] == std::string::npos || SEofNewFile[1] == std::string::npos)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
std::string replacementFileName = shaderFile.substr(SEofNewFile[0], SEofNewFile[1] - SEofNewFile[0]);
|
||||||
|
std::string replacementString = ReadFile(replacementFileName);
|
||||||
|
size_t firstof = replacementString.find_first_of((char)0);
|
||||||
|
replacementString.erase(firstof, replacementString.size() - firstof);
|
||||||
|
if (replacementString.length() <= 0)
|
||||||
|
return 0;
|
||||||
|
shaderFile.replace(startPos, SEofNewFile[1]+2 - startPos, replacementString + "\n");
|
||||||
|
startPos += replacementString.length(); //This might not be wanted.
|
||||||
|
}
|
||||||
|
|
||||||
const GLchar* shaderFiles = shaderFile.c_str();
|
const GLchar* shaderFiles = shaderFile.c_str();
|
||||||
const GLint length = static_cast<GLint>(shaderFile.length());
|
const GLint length = static_cast<GLint>(shaderFile.length());
|
||||||
glShaderSource(shader, 1, &shaderFiles, &length);
|
glShaderSource(shader, 1, &shaderFiles, &length);
|
||||||
@@ -46,6 +56,24 @@ GLuint Shader::CompileShader(GLenum shaderType, std::string fileName)
|
|||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Shader::ReadFile(std::string fileName)
|
||||||
|
{
|
||||||
|
std::string shaderFile;
|
||||||
|
std::ifstream in(fileName, std::ios::in);
|
||||||
|
if (!in) {
|
||||||
|
LOG_ERROR("Error: Failed to open shader file \"%s\"", fileName.c_str());
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
in.seekg(0, std::ios::end);
|
||||||
|
shaderFile.resize((int)in.tellg());
|
||||||
|
in.seekg(0, std::ios::beg);
|
||||||
|
in.read(&shaderFile[0], shaderFile.size());
|
||||||
|
in.close();
|
||||||
|
return shaderFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Shader::Shader(GLenum shaderType, std::string fileName) : m_ShaderType(shaderType), m_FileName(fileName)
|
Shader::Shader(GLenum shaderType, std::string fileName) : m_ShaderType(shaderType), m_FileName(fileName)
|
||||||
{
|
{
|
||||||
m_ShaderHandle = 0;
|
m_ShaderHandle = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user