made trees possible, but they still have issues with overlapping each other wrongly, i suspect the chunkborders, because it mostly happens in lines
This commit is contained in:
2
TSE
2
TSE
Submodule TSE updated: 769bbd4261...f859288689
Binary file not shown.
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.6 KiB |
BIN
TSE-RTS/Resources/trees.aseprite
Normal file
BIN
TSE-RTS/Resources/trees.aseprite
Normal file
Binary file not shown.
BIN
TSE-RTS/Resources/trees.png
Normal file
BIN
TSE-RTS/Resources/trees.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
@@ -1,6 +1,7 @@
|
|||||||
#include "game.hpp"
|
#include "game.hpp"
|
||||||
#include "elements/Transformable.hpp"
|
#include "elements/Transformable.hpp"
|
||||||
#include "BehaviourScripts/TileMap.hpp"
|
#include "BehaviourScripts/TileMap.hpp"
|
||||||
|
#include "BehaviourScripts/OrdererSpriteSet.hpp"
|
||||||
#include "BehaviourScripts/Renderable.hpp"
|
#include "BehaviourScripts/Renderable.hpp"
|
||||||
#include "elements/ShaderRegistry.hpp"
|
#include "elements/ShaderRegistry.hpp"
|
||||||
#include "Vector2.hpp"
|
#include "Vector2.hpp"
|
||||||
@@ -12,25 +13,31 @@
|
|||||||
#include "BehaviourScripts/CameraSizeChangeNotifyer.hpp"
|
#include "BehaviourScripts/CameraSizeChangeNotifyer.hpp"
|
||||||
#include "BehaviourScripts/RenderTextureResizes.hpp"
|
#include "BehaviourScripts/RenderTextureResizes.hpp"
|
||||||
#include "BehaviourScripts/CanvasScaler.hpp"
|
#include "BehaviourScripts/CanvasScaler.hpp"
|
||||||
|
#include "Random.hpp"
|
||||||
|
|
||||||
#define circleRadius 32
|
#define circleRadius 32
|
||||||
#define circleFallof 25
|
#define circleFallof 25
|
||||||
|
#define treeCircleRadius 27
|
||||||
|
#define treeCircleFallof 20
|
||||||
|
|
||||||
void game::setup(TSE::Scene* s, TSE::IWindow* wnd)
|
void game::setup(TSE::Scene* s, TSE::IWindow* wnd)
|
||||||
{
|
{
|
||||||
using namespace TSE;
|
using namespace TSE;
|
||||||
s->AddLayer(&gameLayer);
|
s->AddLayer(&gameLayer);
|
||||||
|
s->AddLayer(&propsLayer);
|
||||||
|
|
||||||
TileMap* maps[4];
|
TileMap* maps[4];
|
||||||
|
OrdererSpriteSet* props;
|
||||||
Material* tileMapMaterial = new Material("tileSetMat", ShaderRegistry::GetShader("TileMapShader v2"));
|
Material* tileMapMaterial = new Material("tileSetMat", ShaderRegistry::GetShader("TileMapShader v2"));
|
||||||
|
tileMapMaterial->SetValue("spritePivot", Vector2(0,0));
|
||||||
|
Texture* setTexture = new Texture("tiles.png");
|
||||||
|
TileSet* set = new TileSet(setTexture, 10, 10);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
Transformable* tileMap = new Transformable("tileMapL" + std::to_string(i));
|
Transformable* tileMap = new Transformable("tileMapL" + std::to_string(i));
|
||||||
tileMap->position += {0,0.5f * i,0};
|
tileMap->position += {0,0.5f * i,0};
|
||||||
gameLayer.AddTransformable(tileMap);
|
gameLayer.AddTransformable(tileMap);
|
||||||
Texture* setTexture = new Texture("tiles.png");
|
|
||||||
TileSet* set = new TileSet(setTexture, 10, 10);
|
|
||||||
TileMap* map = new TileMap();
|
TileMap* map = new TileMap();
|
||||||
map->chunkSize = 12;
|
map->chunkSize = 12;
|
||||||
map->set = set;
|
map->set = set;
|
||||||
@@ -42,19 +49,40 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd)
|
|||||||
|
|
||||||
maps[i] = map;
|
maps[i] = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Material* objectsMaterial = new Material("objectsTileSetMat", ShaderRegistry::GetShader("Basic Ordered Sprite Set Shader"));
|
||||||
|
Texture* treeSetTexture = new Texture("trees.png");
|
||||||
|
TileSet* treeSet = new TileSet(treeSetTexture, 6, 2);
|
||||||
|
Transformable* tileMap = new Transformable("propMap");
|
||||||
|
propsLayer.AddTransformable(tileMap);
|
||||||
|
OrdererSpriteSet* map = new OrdererSpriteSet();
|
||||||
|
map->chunkSize = 12;
|
||||||
|
map->set = treeSet;
|
||||||
|
//map->SpriteScale = Vector2(1,2);
|
||||||
|
|
||||||
|
Renderable* rend = new Renderable(objectsMaterial);
|
||||||
|
|
||||||
|
tileMap->AddBehaviourScript(map);
|
||||||
|
tileMap->AddBehaviourScript(rend);
|
||||||
|
|
||||||
|
props = map;
|
||||||
|
|
||||||
|
|
||||||
|
Random rnd = Random(12345u);
|
||||||
|
|
||||||
|
const siv::PerlinNoise perlin{ rnd.nextUInt() };
|
||||||
const siv::PerlinNoise::seed_type seed = 123456u;
|
const siv::PerlinNoise perlin2{ rnd.nextUInt() };
|
||||||
const siv::PerlinNoise perlin{ seed };
|
|
||||||
|
|
||||||
for (int x = circleRadius * -4; x < circleRadius * 4; x++)
|
for (int x = circleRadius * -4; x < circleRadius * 4; x++)
|
||||||
{
|
{
|
||||||
for (int y = circleRadius * -4; y < circleRadius * 4; y++)
|
for (int y = circleRadius * -4; y < circleRadius * 4; y++)
|
||||||
{
|
{
|
||||||
float noise = (float)perlin.octave2D_01(x * 0.05f,y * 0.05f, 4);
|
float noise = (float)perlin.octave2D_01(x * 0.05f,y * 0.05f, 4);
|
||||||
|
float treeNoise = (float)perlin2.octave2D_01(x * 0.05f,y * 0.05f, 2);
|
||||||
float noiseFallof = 1;
|
float noiseFallof = 1;
|
||||||
|
float treeNoiseFallof = 1;
|
||||||
Vector2 realpos = maps[0]->TileMapToRealPos(Vector2(x,y));
|
Vector2 realpos = maps[0]->TileMapToRealPos(Vector2(x,y));
|
||||||
|
Vector2 realposprop = (maps[0]->TileMapToRealPos(Vector2(x,y)) + Vector2(0, 0.25f)) * Vector2(1,0.5f);
|
||||||
realpos *= {1,1.5f};
|
realpos *= {1,1.5f};
|
||||||
float dist = realpos.Length();
|
float dist = realpos.Length();
|
||||||
if(dist <= circleRadius && dist >= circleFallof)
|
if(dist <= circleRadius && dist >= circleFallof)
|
||||||
@@ -62,24 +90,54 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd)
|
|||||||
float reldist = dist - circleFallof;
|
float reldist = dist - circleFallof;
|
||||||
noiseFallof = (reldist / (circleRadius - circleFallof) - 1) * -1;
|
noiseFallof = (reldist / (circleRadius - circleFallof) - 1) * -1;
|
||||||
}
|
}
|
||||||
|
if(dist <= treeCircleRadius && dist >= treeCircleFallof)
|
||||||
|
{
|
||||||
|
float reldist = dist - treeCircleFallof;
|
||||||
|
treeNoiseFallof = (reldist / (treeCircleRadius - treeCircleFallof) - 1) * -1;
|
||||||
|
}
|
||||||
|
else if (dist > treeCircleRadius)
|
||||||
|
treeNoiseFallof = 0;
|
||||||
noise *= noiseFallof;
|
noise *= noiseFallof;
|
||||||
|
treeNoise *= treeNoiseFallof;
|
||||||
if(dist <= circleRadius && noise >= 0.2f)
|
if(dist <= circleRadius && noise >= 0.2f)
|
||||||
{
|
{
|
||||||
|
float treernd = rnd.nextFloat01();
|
||||||
|
int treeid = 0;
|
||||||
if(noise >= 0.8f)
|
if(noise >= 0.8f)
|
||||||
{
|
{
|
||||||
maps[3]->SetTile(Vector2(x, y), {0,9}, {2,9});
|
if(treeNoise > 0.5f && treernd > 0.4f)
|
||||||
|
{
|
||||||
|
treeid = rnd.nextInt(0,5);
|
||||||
|
props->SetSprite(realposprop + Vector2(0, 0.75f), Vector2(treeid, 1), 4.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0));
|
||||||
|
}
|
||||||
|
maps[3]->SetTile(Vector2(x, y), {0,9}, {1,9});
|
||||||
}
|
}
|
||||||
else if(noise >= 0.6f)
|
else if(noise >= 0.6f)
|
||||||
{
|
{
|
||||||
maps[2]->SetTile(Vector2(x, y), {0,9}, {2,9});
|
if(treeNoise > 0.5f && treernd > 0.4f)
|
||||||
|
{
|
||||||
|
treeid = rnd.nextInt(0,5);
|
||||||
|
props->SetSprite(realposprop + Vector2(0, 0.5f), Vector2(treeid, 1), 3.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0));
|
||||||
|
}
|
||||||
|
maps[2]->SetTile(Vector2(x, y), {0,9}, {1,9});
|
||||||
}
|
}
|
||||||
else if(noise >= 0.4f)
|
else if(noise >= 0.4f)
|
||||||
{
|
{
|
||||||
maps[1]->SetTile(Vector2(x, y), {0,9}, {2,9});
|
if(treeNoise > 0.5f && treernd > 0.4f)
|
||||||
|
{
|
||||||
|
treeid = rnd.nextInt(0,5);
|
||||||
|
props->SetSprite(realposprop + Vector2(0, 0.25f), Vector2(treeid, 1), 2.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0));
|
||||||
|
}
|
||||||
|
maps[1]->SetTile(Vector2(x, y), {0,9}, {1,9});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
maps[0]->SetTile(Vector2(x, y), {0,9}, {2,9});
|
if(treeNoise > 0.5f && treernd > 0.4f)
|
||||||
|
{
|
||||||
|
treeid = rnd.nextInt(0,5);
|
||||||
|
props->SetSprite(realposprop, Vector2(treeid, 1), 1.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0));
|
||||||
|
}
|
||||||
|
maps[0]->SetTile(Vector2(x, y), {0,9}, {1,9});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,12 +146,17 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd)
|
|||||||
//RenderingLayer
|
//RenderingLayer
|
||||||
|
|
||||||
s->AddLayer(&renderingLayer);
|
s->AddLayer(&renderingLayer);
|
||||||
|
s->AddLayer(&characterLayer);
|
||||||
|
|
||||||
|
Transformable* player = new Transformable("Player");
|
||||||
|
|
||||||
Transformable* lastPassCamera = new Transformable("lastPassCamera");
|
Transformable* lastPassCamera = new Transformable("lastPassCamera");
|
||||||
Camera* lpCam = new Camera();
|
Camera* lpCam = new Camera();
|
||||||
lpCam->SetRenderTarget(wnd);
|
lpCam->SetRenderTarget(wnd);
|
||||||
lpCam->SetRenderScale(1);
|
lpCam->SetRenderScale(1);
|
||||||
lpCam->layersNotToRender.push_back(gameLayer.GetID());
|
lpCam->layersNotToRender.push_back(gameLayer.GetID());
|
||||||
|
lpCam->layersNotToRender.push_back(propsLayer.GetID());
|
||||||
|
lpCam->layersNotToRender.push_back(characterLayer.GetID());
|
||||||
lastPassCamera->AddBehaviourScript(lpCam);
|
lastPassCamera->AddBehaviourScript(lpCam);
|
||||||
CameraSizeChangeNotifyer* camNotifyer = new CameraSizeChangeNotifyer();
|
CameraSizeChangeNotifyer* camNotifyer = new CameraSizeChangeNotifyer();
|
||||||
camNotifyer->lastSize = {0,0};
|
camNotifyer->lastSize = {0,0};
|
||||||
@@ -102,21 +165,39 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd)
|
|||||||
|
|
||||||
Vector2 canvasSize = wnd->GetSize() / 4.0f;
|
Vector2 canvasSize = wnd->GetSize() / 4.0f;
|
||||||
|
|
||||||
IRenderTexture* rt = IRenderTexture::factory->CreateTextureHeap(canvasSize, 2);
|
IRenderTexture* rt = IRenderTexture::factory->CreateTextureHeap(canvasSize, 3);
|
||||||
Transformable* firstPassCamera = new Transformable("firstPassCamera");
|
Transformable* firstPassCamera = new Transformable("firstPassCamera");
|
||||||
Camera* fpCam = new Camera();
|
Camera* fpCam = new Camera();
|
||||||
fpCam->SetRenderScale(256);
|
fpCam->SetRenderScale(256);
|
||||||
fpCam->SetRenderTarget(rt);
|
fpCam->SetRenderTarget(rt);
|
||||||
fpCam->layersNotToRender.push_back(renderingLayer.GetID());
|
fpCam->layersNotToRender.push_back(renderingLayer.GetID());
|
||||||
|
fpCam->layersNotToRender.push_back(propsLayer.GetID());
|
||||||
|
fpCam->layersNotToRender.push_back(characterLayer.GetID());
|
||||||
firstPassCamera->AddBehaviourScript(fpCam);
|
firstPassCamera->AddBehaviourScript(fpCam);
|
||||||
RenderTextureResizes* resizer = new RenderTextureResizes();
|
RenderTextureResizes* resizer = new RenderTextureResizes();
|
||||||
resizer->rt = rt;
|
resizer->rt = rt;
|
||||||
camNotifyer->Observe(resizer);
|
camNotifyer->Observe(resizer);
|
||||||
firstPassCamera->AddBehaviourScript(resizer);
|
firstPassCamera->AddBehaviourScript(resizer);
|
||||||
|
firstPassCamera->SetParent(player);
|
||||||
|
|
||||||
|
IRenderTexture* rtProps = IRenderTexture::factory->CreateTextureHeap(canvasSize, 3);
|
||||||
|
Transformable* secondPassCamera = new Transformable("secondPassCamera");
|
||||||
|
Camera* spCam = new Camera();
|
||||||
|
spCam->SetRenderScale(256);
|
||||||
|
spCam->SetRenderTarget(rtProps);
|
||||||
|
spCam->layersNotToRender.push_back(renderingLayer.GetID());
|
||||||
|
spCam->layersNotToRender.push_back(gameLayer.GetID());
|
||||||
|
spCam->layersNotToRender.push_back(characterLayer.GetID());
|
||||||
|
secondPassCamera->AddBehaviourScript(spCam);
|
||||||
|
RenderTextureResizes* resizerProps = new RenderTextureResizes();
|
||||||
|
resizerProps->rt = rtProps;
|
||||||
|
camNotifyer->Observe(resizerProps);
|
||||||
|
secondPassCamera->AddBehaviourScript(resizerProps);
|
||||||
|
secondPassCamera->SetParent(player);
|
||||||
|
|
||||||
//Render pipeline setup
|
//Render pipeline setup
|
||||||
|
|
||||||
gameLayer.AddTransformable(firstPassCamera);
|
characterLayer.AddTransformable(player);
|
||||||
renderingLayer.AddTransformable(lastPassCamera);
|
renderingLayer.AddTransformable(lastPassCamera);
|
||||||
|
|
||||||
//final
|
//final
|
||||||
@@ -130,9 +211,13 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd)
|
|||||||
|
|
||||||
Material* canvasMat = new Material("canvasMat", ShaderRegistry::GetShader("LastPassShader"));
|
Material* canvasMat = new Material("canvasMat", ShaderRegistry::GetShader("LastPassShader"));
|
||||||
canvasMat->SetValue<float>("threshold", 0.01f);
|
canvasMat->SetValue<float>("threshold", 0.01f);
|
||||||
canvasMat->SetValue<float>("darken", 0.45f);
|
canvasMat->SetValue<float>("darken", 0.15f);
|
||||||
canvasMat->SetValue<uint>("colorTextureID", rt->GetTextureId(0));
|
canvasMat->SetValue<uint>("colorTextureID", rt->GetTextureId(0));
|
||||||
canvasMat->SetValue<uint>("heightTextureID", rt->GetTextureId(1));
|
canvasMat->SetValue<uint>("heightTextureID", rt->GetTextureId(1));
|
||||||
|
canvasMat->SetValue<uint>("depthTextureID", rt->GetTextureId(2));
|
||||||
|
canvasMat->SetValue<uint>("colorTexture2ID", rtProps->GetTextureId(0));
|
||||||
|
canvasMat->SetValue<uint>("heightTexture2ID", rtProps->GetTextureId(1));
|
||||||
|
canvasMat->SetValue<uint>("depthTexture2ID", rtProps->GetTextureId(2));
|
||||||
Renderable* canvasRenderer = new Renderable(canvasMat);
|
Renderable* canvasRenderer = new Renderable(canvasMat);
|
||||||
|
|
||||||
CanvasScaler* canvasScaler = new CanvasScaler();
|
CanvasScaler* canvasScaler = new CanvasScaler();
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ class game
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline static TSE::Layer gameLayer = TSE::Layer("gameLayer");
|
inline static TSE::Layer gameLayer = TSE::Layer("gameLayer");
|
||||||
|
inline static TSE::Layer propsLayer = TSE::Layer("propsLayer");
|
||||||
inline static TSE::Layer renderingLayer = TSE::Layer("renderingLayer");
|
inline static TSE::Layer renderingLayer = TSE::Layer("renderingLayer");
|
||||||
|
inline static TSE::Layer characterLayer = TSE::Layer("characterLayer");
|
||||||
|
|
||||||
static void setup(TSE::Scene* s, TSE::IWindow* wnd);
|
static void setup(TSE::Scene* s, TSE::IWindow* wnd);
|
||||||
};
|
};
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
#include "shaders/TileMapShader.hpp"
|
#include "shaders/TileMapShader.hpp"
|
||||||
#include "shaders/LastPassShader.hpp"
|
#include "shaders/LastPassShader.hpp"
|
||||||
|
|
||||||
//#define USE_EDITOR
|
#define USE_EDITOR
|
||||||
|
|
||||||
using namespace TSE;
|
using namespace TSE;
|
||||||
using namespace TSE::GLFW;
|
using namespace TSE::GLFW;
|
||||||
@@ -32,7 +32,7 @@ EditorSubsystem* editor;
|
|||||||
|
|
||||||
void SetupWindow()
|
void SetupWindow()
|
||||||
{
|
{
|
||||||
Color backColor(0.0571f, 0.0819f, 0.1043f);
|
Color backColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
#ifdef USE_EDITOR
|
#ifdef USE_EDITOR
|
||||||
wnd = new WindowGlfw(PROJECT_NAME, 800, 600, new OpenGLRenderingBackend(backColor, false, 8, true), WindowType::Maximized);
|
wnd = new WindowGlfw(PROJECT_NAME, 800, 600, new OpenGLRenderingBackend(backColor, false, 8, true), WindowType::Maximized);
|
||||||
editor = new EditorSubsystem();
|
editor = new EditorSubsystem();
|
||||||
@@ -50,6 +50,7 @@ void SetupWindow()
|
|||||||
|
|
||||||
#ifdef USE_EDITOR
|
#ifdef USE_EDITOR
|
||||||
((Camera*)Transformable::Find(".EditorCamera")->GetBehaviourScript(CAMERA))->layersNotToRender.push_back(game::renderingLayer.GetID());
|
((Camera*)Transformable::Find(".EditorCamera")->GetBehaviourScript(CAMERA))->layersNotToRender.push_back(game::renderingLayer.GetID());
|
||||||
|
((Camera*)Transformable::Find(".EditorCamera")->GetBehaviourScript(CAMERA))->SetRenderScale(128);
|
||||||
currentScene->AddLayer(&editor->editorLayer);
|
currentScene->AddLayer(&editor->editorLayer);
|
||||||
editor->hv.SetScene(currentScene);
|
editor->hv.SetScene(currentScene);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ void LastPassShader::Init(float width, float height)
|
|||||||
instance->Enable();
|
instance->Enable();
|
||||||
instance->SetUniform("colorTexture", 0);
|
instance->SetUniform("colorTexture", 0);
|
||||||
instance->SetUniform("heightTexture", 1);
|
instance->SetUniform("heightTexture", 1);
|
||||||
|
instance->SetUniform("depthTexture", 2);
|
||||||
|
instance->SetUniform("colorTexture2", 3);
|
||||||
|
instance->SetUniform("heightTexture2", 4);
|
||||||
|
instance->SetUniform("depthTexture2", 5);
|
||||||
instance->Disable();
|
instance->Disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,6 +68,14 @@ void LastPassShader::OnFlush()
|
|||||||
glBindTexture(GL_TEXTURE_2D, ColorTextureID);
|
glBindTexture(GL_TEXTURE_2D, ColorTextureID);
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, HeightTextureID);
|
glBindTexture(GL_TEXTURE_2D, HeightTextureID);
|
||||||
|
glActiveTexture(GL_TEXTURE2);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, DepthTextureID);
|
||||||
|
glActiveTexture(GL_TEXTURE3);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, ColorTexture2ID);
|
||||||
|
glActiveTexture(GL_TEXTURE4);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, HeightTexture2ID);
|
||||||
|
glActiveTexture(GL_TEXTURE5);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, DepthTexture2ID);
|
||||||
SetUniform("uThreshold", Threshold);
|
SetUniform("uThreshold", Threshold);
|
||||||
SetUniform("uDarken", Darken);
|
SetUniform("uDarken", Darken);
|
||||||
}
|
}
|
||||||
@@ -79,10 +91,18 @@ void LastPassShader::OnSubmit(const TSE::Transformable &t, float *&target, TSE::
|
|||||||
if (!r) return;
|
if (!r) return;
|
||||||
if(!r->GetMaterial()->HasValue("colorTextureID")) return;
|
if(!r->GetMaterial()->HasValue("colorTextureID")) return;
|
||||||
if(!r->GetMaterial()->HasValue("heightTextureID")) return;
|
if(!r->GetMaterial()->HasValue("heightTextureID")) return;
|
||||||
|
if(!r->GetMaterial()->HasValue("depthTextureID")) return;
|
||||||
|
if(!r->GetMaterial()->HasValue("colorTexture2ID")) return;
|
||||||
|
if(!r->GetMaterial()->HasValue("heightTexture2ID")) return;
|
||||||
|
if(!r->GetMaterial()->HasValue("depthTexture2ID")) return;
|
||||||
if(!r->GetMaterial()->HasValue("threshold")) return;
|
if(!r->GetMaterial()->HasValue("threshold")) return;
|
||||||
if(!r->GetMaterial()->HasValue("darken")) return;
|
if(!r->GetMaterial()->HasValue("darken")) return;
|
||||||
ColorTextureID = r->GetMaterial()->GetValue<uint>("colorTextureID");
|
ColorTextureID = r->GetMaterial()->GetValue<uint>("colorTextureID");
|
||||||
|
ColorTexture2ID = r->GetMaterial()->GetValue<uint>("colorTexture2ID");
|
||||||
HeightTextureID = r->GetMaterial()->GetValue<uint>("heightTextureID");
|
HeightTextureID = r->GetMaterial()->GetValue<uint>("heightTextureID");
|
||||||
|
HeightTexture2ID = r->GetMaterial()->GetValue<uint>("heightTexture2ID");
|
||||||
|
DepthTextureID = r->GetMaterial()->GetValue<uint>("depthTextureID");
|
||||||
|
DepthTexture2ID = r->GetMaterial()->GetValue<uint>("depthTexture2ID");
|
||||||
Threshold = r->GetMaterial()->GetValue<float>("threshold");
|
Threshold = r->GetMaterial()->GetValue<float>("threshold");
|
||||||
Darken = r->GetMaterial()->GetValue<float>("darken");
|
Darken = r->GetMaterial()->GetValue<float>("darken");
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,11 @@ class LastPassShader : public TSE::GLFW::Shader
|
|||||||
private:
|
private:
|
||||||
static LastPassShader* instance;
|
static LastPassShader* instance;
|
||||||
GLuint ColorTextureID;
|
GLuint ColorTextureID;
|
||||||
|
GLuint ColorTexture2ID;
|
||||||
GLuint HeightTextureID;
|
GLuint HeightTextureID;
|
||||||
|
GLuint HeightTexture2ID;
|
||||||
|
GLuint DepthTextureID;
|
||||||
|
GLuint DepthTexture2ID;
|
||||||
float Threshold;
|
float Threshold;
|
||||||
float Darken;
|
float Darken;
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ inline const char* fragLastPass = R"(
|
|||||||
|
|
||||||
uniform sampler2D colorTexture;
|
uniform sampler2D colorTexture;
|
||||||
uniform sampler2D heightTexture;
|
uniform sampler2D heightTexture;
|
||||||
|
uniform sampler2D depthTexture;
|
||||||
|
uniform sampler2D colorTexture2;
|
||||||
|
uniform sampler2D heightTexture2;
|
||||||
|
uniform sampler2D depthTexture2;
|
||||||
|
|
||||||
uniform float uThreshold;
|
uniform float uThreshold;
|
||||||
uniform float uDarken;
|
uniform float uDarken;
|
||||||
@@ -76,8 +80,7 @@ inline const char* fragLastPass = R"(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
|
||||||
ivec2 size = textureSize(heightTexture, 0);
|
ivec2 size = textureSize(heightTexture, 0);
|
||||||
ivec2 p = clamp(ivec2(fs_in.uv_out * vec2(size)), ivec2(0), size - ivec2(1));
|
ivec2 p = clamp(ivec2(fs_in.uv_out * vec2(size)), ivec2(0), size - ivec2(1));
|
||||||
|
|
||||||
@@ -87,8 +90,21 @@ inline const char* fragLastPass = R"(
|
|||||||
float maskH = step(uThreshold, changeInHeight);
|
float maskH = step(uThreshold, changeInHeight);
|
||||||
float maskN = step(uThreshold, changeInNormal);
|
float maskN = step(uThreshold, changeInNormal);
|
||||||
float mask = max(maskH, maskN);
|
float mask = max(maskH, maskN);
|
||||||
|
|
||||||
vec3 col = texelFetch(colorTexture, p, 0).rgb;
|
float d1 = texelFetch(depthTexture, p, 0).r;
|
||||||
|
float d2 = texelFetch(depthTexture2, p, 0).r;
|
||||||
|
float h1 = texelFetch(heightTexture, p, 0).a;
|
||||||
|
float h2 = texelFetch(heightTexture2, p, 0).a;
|
||||||
|
|
||||||
|
vec3 col1 = texelFetch(colorTexture, p, 0).rgb;
|
||||||
|
vec3 col2 = texelFetch(colorTexture2, p, 0).rgb;
|
||||||
|
|
||||||
|
vec3 col = col1;
|
||||||
|
|
||||||
|
if(d2 < d1 && d2 != 0 || h1 < h2 && h2 != 0 && d2 >= d1)
|
||||||
|
{
|
||||||
|
col = col2;
|
||||||
|
}
|
||||||
col *= mix(1.0, 1.0 - uDarken, mask);
|
col *= mix(1.0, 1.0 - uDarken, mask);
|
||||||
|
|
||||||
color = vec4(col, 1.0);
|
color = vec4(col, 1.0);
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ void TileMapShader::OnDrawCall(int indexCount)
|
|||||||
SetUniform("spriteCount", &SpriteCount);
|
SetUniform("spriteCount", &SpriteCount);
|
||||||
SetUniform("spriteScale", &SpriteScale);
|
SetUniform("spriteScale", &SpriteScale);
|
||||||
SetUniform("layerHeight", LayerHeight);
|
SetUniform("layerHeight", LayerHeight);
|
||||||
|
SetUniform("spritePivot", &SpritePivot);
|
||||||
|
|
||||||
GLint prevElementBuffer = 0;
|
GLint prevElementBuffer = 0;
|
||||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &prevElementBuffer);
|
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &prevElementBuffer);
|
||||||
@@ -183,12 +184,16 @@ void TileMapShader::OnSubmit(const Transformable &t, float *&target, Transformat
|
|||||||
auto* tm = dynamic_cast<TileMap*>(t.GetBehaviourScript(TILE_MAP));
|
auto* tm = dynamic_cast<TileMap*>(t.GetBehaviourScript(TILE_MAP));
|
||||||
if (!tm) return;
|
if (!tm) return;
|
||||||
|
|
||||||
LayerHeight = t.position.y / 1.5f;
|
LayerHeight = (1 + t.position.y / 0.5f) / 10.0f;
|
||||||
|
|
||||||
|
if(!r->GetMaterial()->HasValue("spritePivot")) return;
|
||||||
|
SpritePivot = r->GetMaterial()->GetValue<Vector2>("spritePivot");
|
||||||
|
|
||||||
auto tileSet = tm->GetTileSet();
|
auto tileSet = tm->GetTileSet();
|
||||||
TextureID = tileSet->GetTextueID();
|
TextureID = tileSet->GetTextueID();
|
||||||
SpriteCount = tileSet->GetCount();
|
SpriteCount = tileSet->GetCount();
|
||||||
SpriteScale = tm->SpriteScale;
|
SpriteScale = tm->SpriteScale;
|
||||||
|
auto nextLine = tm->GetNextLineOffset();
|
||||||
|
|
||||||
const std::vector<Vector2> orderedChunks = *tm->GetChunkPositionsInOrder();
|
const std::vector<Vector2> orderedChunks = *tm->GetChunkPositionsInOrder();
|
||||||
|
|
||||||
@@ -206,7 +211,7 @@ void TileMapShader::OnSubmit(const Transformable &t, float *&target, Transformat
|
|||||||
|
|
||||||
for (int i = 0; i < spriteCount; i++)
|
for (int i = 0; i < spriteCount; i++)
|
||||||
{
|
{
|
||||||
Matrix4x4 mat = Matrix4x4::ToTranslationMatrix((chunkPos - chunk->nextLine * chunkPos.y) + spritePositions[i]) * Matrix4x4::ToRotationMatrix(Quaternion()) * Matrix4x4::ToScaleMatrix({1,1,1});
|
Matrix4x4 mat = Matrix4x4::ToTranslationMatrix((chunkPos * Vector2(nextLine.x, nextLine.y * 0.5f) + Vector2(-nextLine.x * chunkPos.y, nextLine.y * 0.5f * chunkPos.x)) + spritePositions[i]) * Matrix4x4::ToRotationMatrix(Quaternion()) * Matrix4x4::ToScaleMatrix({1,1,1});
|
||||||
stack.Push(mat);
|
stack.Push(mat);
|
||||||
Vector3 pos = stack.Top() * Vector3(0,0,0);
|
Vector3 pos = stack.Top() * Vector3(0,0,0);
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ private:
|
|||||||
TSE::Vector2 SpriteCount;
|
TSE::Vector2 SpriteCount;
|
||||||
TSE::Vector2 SpriteScale;
|
TSE::Vector2 SpriteScale;
|
||||||
float LayerHeight;
|
float LayerHeight;
|
||||||
|
int isObjectsLayer;
|
||||||
|
TSE::Vector2 SpritePivot;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static TileMapShader* Instance();
|
static TileMapShader* Instance();
|
||||||
|
|||||||
@@ -13,10 +13,12 @@ inline const char* vertTile2 = R"(
|
|||||||
uniform mat4 camMatrix;
|
uniform mat4 camMatrix;
|
||||||
uniform vec2 spriteCount;
|
uniform vec2 spriteCount;
|
||||||
uniform vec2 spriteScale;
|
uniform vec2 spriteScale;
|
||||||
|
uniform vec2 spritePivot;
|
||||||
|
|
||||||
out vec2 vUV;
|
out vec2 vUV;
|
||||||
flat out int vSpriteId;
|
flat out int vSpriteId;
|
||||||
flat out int vNormalId;
|
flat out int vNormalId;
|
||||||
|
flat out float vTileNdcY;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
@@ -26,11 +28,18 @@ inline const char* vertTile2 = R"(
|
|||||||
|
|
||||||
vec3 worldPos = (iTilePos * tileSize) + (local * tileSize);
|
vec3 worldPos = (iTilePos * tileSize) + (local * tileSize);
|
||||||
|
|
||||||
gl_Position = prMatrix * camMatrix * vec4(worldPos.x, worldPos.y, worldPos.z, 1.0);
|
vec4 clip = prMatrix * camMatrix * vec4(worldPos, 1.0);
|
||||||
|
gl_Position = clip;
|
||||||
|
|
||||||
vUV = baseUV;
|
vUV = baseUV;
|
||||||
vSpriteId = int(iSpriteId + 0.5);
|
vSpriteId = int(iSpriteId + 0.5);
|
||||||
vNormalId = int(iNormalId + 0.5);
|
vNormalId = int(iNormalId + 0.5);
|
||||||
|
|
||||||
|
vec3 localbottom = vec3(spritePivot.x, spritePivot.y, 0);
|
||||||
|
vec3 worldPosBottom = (iTilePos * tileSize) + (localbottom * tileSize);
|
||||||
|
vec4 clipbottom = prMatrix * camMatrix * vec4(worldPosBottom, 1.0);
|
||||||
|
float ndcY = clipbottom.y / clipbottom.w;
|
||||||
|
vTileNdcY = ndcY * 0.5 + 0.5;
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
@@ -40,6 +49,7 @@ inline const char* fragTile2 = R"(
|
|||||||
in vec2 vUV;
|
in vec2 vUV;
|
||||||
flat in int vSpriteId;
|
flat in int vSpriteId;
|
||||||
flat in int vNormalId;
|
flat in int vNormalId;
|
||||||
|
flat in float vTileNdcY;
|
||||||
|
|
||||||
uniform sampler2D atlas;
|
uniform sampler2D atlas;
|
||||||
uniform vec2 spriteCount;
|
uniform vec2 spriteCount;
|
||||||
@@ -47,9 +57,13 @@ inline const char* fragTile2 = R"(
|
|||||||
|
|
||||||
layout(location = 0) out vec4 FragColor;
|
layout(location = 0) out vec4 FragColor;
|
||||||
layout(location = 1) out vec4 FragHeight;
|
layout(location = 1) out vec4 FragHeight;
|
||||||
|
layout(location = 2) out vec4 FragDepth;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
float t = (vTileNdcY + 1.0) * 0.5 *0.8;
|
||||||
|
FragDepth = vec4(t, 0, 0, 1.0);
|
||||||
|
|
||||||
vec2 tileUVSize = 1.0 / spriteCount;
|
vec2 tileUVSize = 1.0 / spriteCount;
|
||||||
|
|
||||||
int cols = int(spriteCount.x);
|
int cols = int(spriteCount.x);
|
||||||
|
|||||||
Reference in New Issue
Block a user