diff --git a/Game.cpp b/Game.cpp index 54c7e8c..5e21dce 100755 --- a/Game.cpp +++ b/Game.cpp @@ -53,6 +53,7 @@ void Game::setup() { // Initialize renderer renderer.shaderManager.AddShaderFromFiles("default", "./default.vertex", "./default.fragment"); renderer.shaderManager.AddShaderFromFiles("defaultColor", "./defaultColor.vertex", "./defaultColor.fragment"); + renderer.shaderManager.AddShaderFromFiles("defaultHideCam", "./defaultHideCam.vertex", "./defaultHideCam.fragment"); // Initialize game objects std::cout << "Hello 2" << std::endl; diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index 0e82b0b..b38df32 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -361,6 +361,18 @@ void GameObjectManager::updateScene(size_t ms) { Environment::cameraShift.v[0] += directionVector.v[0] * ms; Environment::cameraShift.v[2] += directionVector.v[1] * ms; } + if (Environment::downPressed) { + Environment::cameraShift.v[0] -= directionVector.v[0] * ms; + Environment::cameraShift.v[2] -= directionVector.v[1] * ms; + } + if (Environment::rightPressed) { + Environment::cameraShift.v[2] += directionVector.v[0] * ms; + Environment::cameraShift.v[0] -= directionVector.v[1] * ms; + } + if (Environment::leftPressed) { + Environment::cameraShift.v[2] -= directionVector.v[0] * ms; + Environment::cameraShift.v[0] += directionVector.v[1] * ms; + } Environment::characterPos.v[0] = -Environment::cameraShift.v[0]; Environment::characterPos.v[1] = -Environment::cameraShift.v[1]; diff --git a/RenderSystem.cpp b/RenderSystem.cpp index 0c67204..9860172 100644 --- a/RenderSystem.cpp +++ b/RenderSystem.cpp @@ -9,9 +9,11 @@ namespace ZL { void RenderSystem::initialize() { + /* renderer.shaderManager.AddShaderFromFiles("default", "./default.vertex", "./default.fragment"); + renderer.shaderManager.AddShaderFromFiles("defaultHideCam", "./defaultHideCam.vertex", "./defaultHideCam.fragment"); renderer.shaderManager.AddShaderFromFiles("defaultColor", "./defaultColor.vertex", "./defaultColor.fragment"); - renderer.InitOpenGL(); + renderer.InitOpenGL();*/ } void RenderSystem::drawScene(GameObjectManager& gameObjects) { @@ -100,12 +102,15 @@ void RenderSystem::drawViola(GameObjectManager& gameObjects) void RenderSystem::drawWorld(GameObjectManager& gameObjects) { static const std::string defaultShaderName = "default"; static const std::string colorShaderName = "defaultColor"; + static const std::string hideCamShaderName = "defaultHideCam"; static const std::string vPositionName = "vPosition"; static const std::string vTexCoordName = "vTexCoord"; static const std::string vColorName = "vColor"; static const std::string textureUniformName = "Texture"; + //static const std::string modelViewMatrixName = "modelView"; + /* renderer.shaderManager.PushShader(defaultShaderName); renderer.RenderUniform1i(textureUniformName, 0); @@ -122,9 +127,26 @@ void RenderSystem::drawWorld(GameObjectManager& gameObjects) { drawViola(gameObjects); - renderer.shaderManager.PushShader(defaultShaderName); + renderer.shaderManager.PushShader(hideCamShaderName); renderer.RenderUniform1i(textureUniformName, 0); + Vector3f testVec1{ 0,0,0 }; + + Vector3f testVec2{ 0,400,-600 }; + renderer.RenderUniform3fv("targetPos", &Environment::characterPos.v[0]); + //renderer.RenderUniform3fv("targetPos", &testVec1.v[0]); + + Vector3f cameraPos = Vector3f{ 0,0, 100 * Environment::zoom }; + + cameraPos = MultVectorMatrix(cameraPos, QuatToMatrix(QuatFromRotateAroundX(Environment::cameraAlpha))); + cameraPos = MultVectorMatrix(cameraPos, QuatToMatrix(QuatFromRotateAroundY(Environment::cameraPhi))); + + cameraPos = cameraPos + Environment::characterPos; + renderer.RenderUniform3fv("eyePos", &cameraPos.v[0]); + //renderer.RenderUniform3fv("eyePos", &testVec2.v[0]); + + + renderer.EnableVertexAttribArray(vPositionName); renderer.EnableVertexAttribArray(vTexCoordName); diff --git a/Renderer.cpp b/Renderer.cpp index d31d596..f8ac121 100755 --- a/Renderer.cpp +++ b/Renderer.cpp @@ -583,6 +583,18 @@ namespace ZL { } } + void Renderer::RenderUniform3fv(const std::string& uniformName, const float* value) + { + auto shader = shaderManager.GetCurrentShader(); + + auto uniform = shader->uniformList.find(uniformName); + + if (uniform != shader->uniformList.end()) + { + glUniform3fv(uniform->second, 1, value); + } + } + void Renderer::RenderUniform1i(const std::string& uniformName, const int value) { auto shader = shaderManager.GetCurrentShader(); diff --git a/Renderer.h b/Renderer.h index 405b2aa..a4bd793 100755 --- a/Renderer.h +++ b/Renderer.h @@ -117,6 +117,8 @@ namespace ZL { void RenderUniformMatrix4fv(const std::string& uniformName, bool transpose, const float* value); void RenderUniform1i(const std::string& uniformName, const int value); + void RenderUniform3fv(const std::string& uniformName, const float* value); + void VertexAttribPointer2fv(const std::string& attribName, int stride, const char* pointer); diff --git a/defaultHideCam.fragment b/defaultHideCam.fragment new file mode 100644 index 0000000..f276940 --- /dev/null +++ b/defaultHideCam.fragment @@ -0,0 +1,61 @@ +uniform sampler2D Texture; +varying vec2 texCoord; +varying vec3 vWorldPos; + +uniform vec3 eyePos; // Позиция камеры +uniform vec3 targetPos; // Цель камеры + +void main() +{ +/* + float maxDistance = 2000; + float alpha = 0.0; + vec4 color = texture2D(Texture, texCoord); + + vec3 dir = targetPos - eyePos; + float dirLengthSq = dot(dir, dir); + + if (dirLengthSq > 0.0) + { + vec3 objToEye = vWorldPos - eyePos; + float t = dot(objToEye, dir) / dirLengthSq; + + if (t >= 0.0 && t <= 1.0) + { + vec3 projection = eyePos + t * dir; + vec3 delta = vWorldPos - projection; + float distSq = dot(delta, delta); + + if (distSq < maxDistance * maxDistance) + { + //color.a *= alpha; // Применяем прозрачность + color.rgb = vec3(1,0,0); + } + } + } + */ + vec4 color; + + vec3 dirToCamera = normalize(eyePos - targetPos); + vec3 dirToVertex = normalize(vWorldPos - targetPos); + + float dotProduct = dot(dirToCamera, dirToVertex); + + float distanceX = abs(vWorldPos.x); + float distanceZ = abs(vWorldPos.z); + + float distanceToCamera = length(vWorldPos - targetPos); + + if ((distanceX > 750 || distanceZ > 750) && (dotProduct > 0.93)) + { + //color.rgba = vec4(1,0,0,1); + discard; + } + else + { + color.rgb = texture2D(Texture, texCoord).rgb; + //color.rgb = vec3(clamp(vWorldPos.z/500, 0, 1), 0, 0); + color.a = 1; + } + gl_FragColor = color; +} \ No newline at end of file diff --git a/defaultHideCam.vertex b/defaultHideCam.vertex new file mode 100644 index 0000000..01069fc --- /dev/null +++ b/defaultHideCam.vertex @@ -0,0 +1,15 @@ +attribute vec3 vPosition; +attribute vec2 vTexCoord; +varying vec2 texCoord; +varying vec3 vWorldPos; // Мировая позиция вершины + +uniform mat4 ProjectionModelViewMatrix; +//uniform mat4 ModelMatrix; // Матрица модели объекта + +void main() +{ + vec4 worldPos = vec4(vPosition, 1.0); + vWorldPos = worldPos.xyz; + gl_Position = ProjectionModelViewMatrix * vec4(vPosition, 1.0); + texCoord = vTexCoord; +} \ No newline at end of file