Compare commits
3 Commits
c607ebcc72
...
fd8973d10d
Author | SHA1 | Date |
---|---|---|
Riyyi | fd8973d10d | 4 months ago |
Riyyi | bc3f2c9db5 | 4 months ago |
Riyyi | 0dd7a05d46 | 4 months ago |
40 changed files with 1091 additions and 195 deletions
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 79 KiB |
@ -0,0 +1,49 @@ |
|||||||
|
#version 450 core |
||||||
|
|
||||||
|
layout(location = 0) out vec4 color; |
||||||
|
|
||||||
|
in vec4 v_color; |
||||||
|
in vec3 v_textureCoordinates; |
||||||
|
in flat float v_textureIndex; |
||||||
|
|
||||||
|
uniform samplerCube u_textures[32]; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
vec4 textureColor = v_color; |
||||||
|
switch(int(v_textureIndex)) { |
||||||
|
case 0: break; // Texture unit 0 is reserved for no texture |
||||||
|
case 1: textureColor *= texture(u_textures[1], v_textureCoordinates); break; |
||||||
|
case 2: textureColor *= texture(u_textures[2], v_textureCoordinates); break; |
||||||
|
case 3: textureColor *= texture(u_textures[3], v_textureCoordinates); break; |
||||||
|
case 4: textureColor *= texture(u_textures[4], v_textureCoordinates); break; |
||||||
|
case 5: textureColor *= texture(u_textures[5], v_textureCoordinates); break; |
||||||
|
case 6: textureColor *= texture(u_textures[6], v_textureCoordinates); break; |
||||||
|
case 7: textureColor *= texture(u_textures[7], v_textureCoordinates); break; |
||||||
|
case 8: textureColor *= texture(u_textures[8], v_textureCoordinates); break; |
||||||
|
case 9: textureColor *= texture(u_textures[9], v_textureCoordinates); break; |
||||||
|
case 10: textureColor *= texture(u_textures[10], v_textureCoordinates); break; |
||||||
|
case 11: textureColor *= texture(u_textures[11], v_textureCoordinates); break; |
||||||
|
case 12: textureColor *= texture(u_textures[12], v_textureCoordinates); break; |
||||||
|
case 13: textureColor *= texture(u_textures[13], v_textureCoordinates); break; |
||||||
|
case 14: textureColor *= texture(u_textures[14], v_textureCoordinates); break; |
||||||
|
case 15: textureColor *= texture(u_textures[15], v_textureCoordinates); break; |
||||||
|
case 16: textureColor *= texture(u_textures[16], v_textureCoordinates); break; |
||||||
|
case 17: textureColor *= texture(u_textures[17], v_textureCoordinates); break; |
||||||
|
case 18: textureColor *= texture(u_textures[18], v_textureCoordinates); break; |
||||||
|
case 19: textureColor *= texture(u_textures[19], v_textureCoordinates); break; |
||||||
|
case 20: textureColor *= texture(u_textures[20], v_textureCoordinates); break; |
||||||
|
case 21: textureColor *= texture(u_textures[21], v_textureCoordinates); break; |
||||||
|
case 22: textureColor *= texture(u_textures[22], v_textureCoordinates); break; |
||||||
|
case 23: textureColor *= texture(u_textures[23], v_textureCoordinates); break; |
||||||
|
case 24: textureColor *= texture(u_textures[24], v_textureCoordinates); break; |
||||||
|
case 25: textureColor *= texture(u_textures[25], v_textureCoordinates); break; |
||||||
|
case 26: textureColor *= texture(u_textures[26], v_textureCoordinates); break; |
||||||
|
case 27: textureColor *= texture(u_textures[27], v_textureCoordinates); break; |
||||||
|
case 28: textureColor *= texture(u_textures[28], v_textureCoordinates); break; |
||||||
|
case 29: textureColor *= texture(u_textures[29], v_textureCoordinates); break; |
||||||
|
case 30: textureColor *= texture(u_textures[30], v_textureCoordinates); break; |
||||||
|
case 31: textureColor *= texture(u_textures[31], v_textureCoordinates); break; |
||||||
|
} |
||||||
|
color = textureColor; |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
#version 450 core |
||||||
|
|
||||||
|
layout(location = 0) in vec3 a_position; |
||||||
|
layout(location = 1) in vec4 a_color; |
||||||
|
layout(location = 2) in float a_textureIndex; |
||||||
|
|
||||||
|
out vec4 v_color; |
||||||
|
out vec3 v_textureCoordinates; |
||||||
|
out flat float v_textureIndex; |
||||||
|
|
||||||
|
uniform mat4 u_projectionView; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
v_color = a_color; |
||||||
|
v_textureCoordinates = a_position; |
||||||
|
v_textureIndex = a_textureIndex; |
||||||
|
// Vclip = Camera projection * Camera view * Model transform * Vlocal |
||||||
|
gl_Position = u_projectionView * vec4(a_position, 1.0f); |
||||||
|
} |
@ -1,50 +1,111 @@ |
|||||||
{ |
{ |
||||||
"init": "assets/lua/scene1-init.lua", |
"init": "assets/lua/scene1-init.lua", |
||||||
"camera": { |
"entities": [ |
||||||
"name": "Camera", |
|
||||||
"translate": [ 0.0, 0.0, 1.0 ], |
|
||||||
"rotate": [ 0.0, 0.0, -1.0 ], |
|
||||||
"scale": [ 1.0, 1.0, 1.0 ], |
|
||||||
"type": "perspective", |
|
||||||
"script": { |
|
||||||
"type": "lua", |
|
||||||
"name": "assets/lua/cameracontroller.lua" |
|
||||||
} |
|
||||||
}, |
|
||||||
"quad": [ |
|
||||||
{ |
{ |
||||||
"name": "Quad", |
"id": { "id": 12312312 }, |
||||||
"translate": [ 0.0, 0.0, 0.0 ], |
"tag": { "tag": "Camera" }, |
||||||
"rotate": [ 0.0, 0.0, 0.0 ], |
"transform" : { |
||||||
"scale": [ 1.0, 1.0, 1.0 ], |
"translate": [0.0, 0.0, 1.0], |
||||||
"color": [ 1.0, 1.0, 1.0, 1.0 ], |
"rotate": [0.0, 0.0, -1.0], |
||||||
"texture": "assets/gfx/test.png" |
"scale": [1.0, 1.0, 1.0] |
||||||
|
}, |
||||||
|
"camera": { "type": "perspective" }, |
||||||
|
"lua-scripts": [ |
||||||
|
{ "path": "assets/lua/cameracontroller.lua" } |
||||||
|
] |
||||||
}, |
}, |
||||||
{ |
{ |
||||||
"name": "Quad 2", |
"id": { "id": 212563732 }, |
||||||
"translate": [ 1.1, 0.0, 0.0 ], |
"tag": { "tag": "Skybox" }, |
||||||
"rotate": [ 0.0, 0.0, 0.0 ], |
"transform" : { |
||||||
"scale": [ 1.0, 1.0, 1.0 ], |
"translate": [0.0, 0.0, 0.0], |
||||||
"color": [ 0.5, 0.6, 0.8, 1.0 ], |
"rotate": [0.0, 0.0, 0.0], |
||||||
"texture": "assets/gfx/test.png" |
"scale": [100.0, 100.0, 100.0] |
||||||
|
}, |
||||||
|
"cubemap": { |
||||||
|
"color": [ 1.0, 1.0, 1.0, 1.0 ], |
||||||
|
"texture": "assets/gfx/skybox.jpg" |
||||||
|
} |
||||||
}, |
}, |
||||||
{ |
{ |
||||||
"name": "Quad 3", |
"id": { "id": 564564564 }, |
||||||
"translate": [ 2.2, 0.0, 0.0 ], |
"tag": { "tag": "Quad" }, |
||||||
"rotate": [ 0.0, 0.0, 0.0 ], |
"transform" : { |
||||||
"scale": [ 1.0, 1.0, 1.0 ], |
"translate": [ 0.0, 0.0, 0.0 ], |
||||||
"color": [ 1.0, 1.0, 1.0, 1.0 ], |
"rotate": [ 0.0, 0.0, 0.0 ], |
||||||
"texture": "assets/gfx/test-inverted.png" |
"scale": [ 1.0, 1.0, 1.0 ] |
||||||
} |
}, |
||||||
], |
"sprite": { |
||||||
"text": [ |
"color": [ 1.0, 1.0, 1.0, 1.0 ], |
||||||
|
"texture": "assets/gfx/test.png" |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": { "id": 97897897 }, |
||||||
|
"tag": { "tag": "Quad 2" }, |
||||||
|
"transform" : { |
||||||
|
"translate": [ 1.1, 0.0, 0.0 ], |
||||||
|
"rotate": [ 0.0, 0.0, 0.0 ], |
||||||
|
"scale": [ 1.0, 1.0, 1.0 ] |
||||||
|
}, |
||||||
|
"sprite": { |
||||||
|
"color": [ 0.5, 0.6, 0.8, 1.0 ], |
||||||
|
"texture": "assets/gfx/test.png" |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"id": { "id": 3424242 }, |
||||||
|
"tag": { "tag": "Quad 3" }, |
||||||
|
"transform" : { |
||||||
|
"translate": [ 2.2, 1.0, 0.0 ], |
||||||
|
"rotate": [ 0.0, 0.0, -20.0 ], |
||||||
|
"scale": [ 1.0, 1.0, 1.0 ] |
||||||
|
}, |
||||||
|
"sprite": { |
||||||
|
"color": [ 1.0, 1.0, 1.0, 1.0 ], |
||||||
|
"texture": "assets/gfx/test-inverted.png" |
||||||
|
}, |
||||||
|
"children": [ |
||||||
|
{ |
||||||
|
"id": { "id": 4345472 }, |
||||||
|
"tag": { "tag": "Quad 4" }, |
||||||
|
"transform" : { |
||||||
|
"translate": [ 0.85, 0.0, 0.0 ], |
||||||
|
"rotate": [ 0.0, 0.0, 0.0 ], |
||||||
|
"scale": [ 0.5, 0.5, 1.0 ] |
||||||
|
}, |
||||||
|
"sprite": { |
||||||
|
"color": [ 1.0, 1.0, 1.0, 1.0 ], |
||||||
|
"texture": "assets/gfx/test-inverted.png" |
||||||
|
}, |
||||||
|
"children": [ |
||||||
|
{ |
||||||
|
"id": { "id": 5234723 }, |
||||||
|
"tag": { "tag": "Quad 5" }, |
||||||
|
"transform" : { |
||||||
|
"translate": [ 1.0, 0.0, 0.0 ], |
||||||
|
"rotate": [ 0.0, 0.0, -20.0 ], |
||||||
|
"scale": [ 0.5, 0.5, 1.0 ] |
||||||
|
}, |
||||||
|
"sprite": { |
||||||
|
"color": [ 1.0, 1.0, 1.0, 1.0 ], |
||||||
|
"texture": "assets/gfx/test-inverted.png" |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
{ |
{ |
||||||
"name": "Text", |
"id": { "id": 675754 }, |
||||||
"content": "Hello World!", |
"tag": { "tag": "Text" }, |
||||||
"font": "assets/fnt/open-sans", |
"text": { |
||||||
"font-size": 24, |
"content": "Hello World!", |
||||||
"line-spacing": 1.0, |
"font": "assets/fnt/open-sans", |
||||||
"width": 150 |
"font-size": 24, |
||||||
|
"line-spacing": 1.0, |
||||||
|
"width": 150 |
||||||
|
} |
||||||
} |
} |
||||||
] |
] |
||||||
} |
} |
||||||
|
@ -0,0 +1,26 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ruc/format/print.h" |
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/component/cameracomponent.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, CameraComponent& value) |
||||||
|
{ |
||||||
|
VERIFY(json.type() == ruc::Json::Type::Object); |
||||||
|
|
||||||
|
if (json.exists("type")) { |
||||||
|
value.type = json.at("type").get<std::string>() == "orthographic" ? CameraType::Orthographic : CameraType::Perspective; |
||||||
|
} |
||||||
|
if (json.exists("zoom-level")) { |
||||||
|
json.at("zoom-level").getTo(value.zoomLevel); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,27 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/component/cubemap-component.h" |
||||||
|
#include "inferno/component/spritecomponent.h" // TODO: Move glm::x toJson/fromJson to separate file |
||||||
|
#include "inferno/render/texture.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, CubemapComponent& value) |
||||||
|
{ |
||||||
|
VERIFY(json.type() == ruc::Json::Type::Object); |
||||||
|
|
||||||
|
if (json.exists("color")) { |
||||||
|
json.at("color").getTo(value.color); |
||||||
|
} |
||||||
|
if (json.exists("texture") && json.at("texture").type() == ruc::Json::Type::String) { |
||||||
|
value.texture = TextureManager::the().load(json.at("texture").asString(), Texture::Type::Cubemap); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,25 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <memory> // std::shared_ptr |
||||||
|
|
||||||
|
#include "glm/ext/vector_float4.hpp" // glm::vec4 |
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/render/texture.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
struct CubemapComponent { |
||||||
|
glm::vec4 color { 1.0f }; |
||||||
|
std::shared_ptr<Texture> texture; |
||||||
|
}; |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, CubemapComponent& value); |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,22 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/component/id-component.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, IDComponent& value) |
||||||
|
{ |
||||||
|
VERIFY(json.type() == ruc::Json::Type::Object); |
||||||
|
|
||||||
|
if (json.exists("id")) { |
||||||
|
json.at("id").getTo(value.id); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,28 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/uid.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
struct IDComponent { |
||||||
|
UID id; |
||||||
|
|
||||||
|
IDComponent() = default; |
||||||
|
IDComponent(UID id) |
||||||
|
: id(id) |
||||||
|
{ |
||||||
|
} |
||||||
|
IDComponent(const IDComponent&) = default; |
||||||
|
}; |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, IDComponent& value); |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,21 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/component/luascriptcomponent.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, LuaScriptComponent& value) |
||||||
|
{ |
||||||
|
VERIFY(json.type() == ruc::Json::Type::Object); |
||||||
|
|
||||||
|
VERIFY(json.exists("path"), "path not found"); |
||||||
|
json.at("path").getTo(value.path); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,21 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/component/nativescriptcomponent.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, NativeScriptComponent& value) |
||||||
|
{ |
||||||
|
VERIFY(json.type() == ruc::Json::Type::Object); |
||||||
|
|
||||||
|
VERIFY(json.exists("name"), "name not found"); |
||||||
|
json.at("name").getTo(value.name); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,22 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/component/tagcomponent.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, TagComponent& value) |
||||||
|
{ |
||||||
|
VERIFY(json.type() == ruc::Json::Type::Object); |
||||||
|
|
||||||
|
if (json.exists("tag")) { |
||||||
|
json.at("tag").getTo(value.tag); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,38 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <cstdint> |
||||||
|
#include <random> |
||||||
|
|
||||||
|
#include "ruc/format/log.h" |
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
#include "inferno/uid.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
static std::random_device s_seed; |
||||||
|
static std::mt19937_64 s_engine(s_seed()); |
||||||
|
static std::uniform_int_distribution<uint64_t> s_distribution; |
||||||
|
|
||||||
|
UID::UID() |
||||||
|
: m_uid(s_distribution(s_engine)) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
UID::UID(uint64_t uid) |
||||||
|
: m_uid(uid) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, UID& value) |
||||||
|
{ |
||||||
|
VERIFY(json.type() == ruc::Json::Type::Number); |
||||||
|
|
||||||
|
value = UID((int64_t)json.asDouble()); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,47 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <cstdint> // uint64_t |
||||||
|
|
||||||
|
#include "ruc/json/json.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
class UID { |
||||||
|
public: |
||||||
|
UID(); |
||||||
|
UID(uint64_t uid); |
||||||
|
|
||||||
|
// Comparison operator for std::map
|
||||||
|
bool operator<(const UID& other) const |
||||||
|
{ |
||||||
|
return m_uid < other.m_uid; |
||||||
|
} |
||||||
|
|
||||||
|
operator uint64_t() const { return m_uid; } |
||||||
|
|
||||||
|
private: |
||||||
|
uint64_t m_uid; |
||||||
|
}; |
||||||
|
|
||||||
|
void fromJson(const ruc::Json& json, UID& value); |
||||||
|
|
||||||
|
} // namespace Inferno
|
||||||
|
|
||||||
|
namespace std { |
||||||
|
|
||||||
|
// Hash function for std::unordered_map
|
||||||
|
template<> |
||||||
|
struct hash<Inferno::UID> { |
||||||
|
size_t operator()(const Inferno::UID& uid) const |
||||||
|
{ |
||||||
|
return hash<uint64_t>()(static_cast<uint64_t>(uid)); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace std
|
Loading…
Reference in new issue