summaryrefslogtreecommitdiff
path: root/game
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-04-14 18:03:34 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2023-04-14 18:03:34 +0100
commit5776a36b454fac04617313da011d7aa2b0e834d3 (patch)
tree1eb96d07e9a17a51e5763f397fc003f762cd2e75 /game
parentMerge branch 'model-factory-textures' (diff)
parentAdd an asset template and use it to define all the foliage assets in the plan... (diff)
downloadilt-5776a36b454fac04617313da011d7aa2b0e834d3.tar.bz2
ilt-5776a36b454fac04617313da011d7aa2b0e834d3.tar.xz
ilt-5776a36b454fac04617313da011d7aa2b0e834d3.zip
Merge branch 'assimp'
Diffstat (limited to 'game')
-rw-r--r--game/scenary/foliage.cpp33
-rw-r--r--game/scenary/foliage.h22
-rw-r--r--game/scenary/plant.cpp13
-rw-r--r--game/scenary/plant.h22
-rw-r--r--game/vehicles/railVehicleClass.cpp53
-rw-r--r--game/vehicles/railVehicleClass.h9
6 files changed, 90 insertions, 62 deletions
diff --git a/game/scenary/foliage.cpp b/game/scenary/foliage.cpp
new file mode 100644
index 0000000..d39d500
--- /dev/null
+++ b/game/scenary/foliage.cpp
@@ -0,0 +1,33 @@
+#include "foliage.h"
+#include "gfx/gl/sceneShader.h"
+#include "gfx/gl/shadowMapper.h"
+#include "gfx/models/texture.h"
+
+bool
+Foliage::persist(Persistence::PersistenceStore & store)
+{
+ return STORE_TYPE && STORE_HELPER(bodyMesh, Asset::MeshConstruct) && Asset::persist(store);
+}
+
+void
+Foliage::postLoad()
+{
+ texture = getTexture();
+}
+
+void
+Foliage::render(const SceneShader & shader, const Location & loc) const
+{
+ shader.basic.use(loc);
+ if (texture) {
+ texture->bind();
+ }
+ bodyMesh->Draw();
+}
+
+void
+Foliage::shadows(const ShadowMapper & mapper, const Location & loc) const
+{
+ mapper.dynamicPoint.use(loc);
+ bodyMesh->Draw();
+}
diff --git a/game/scenary/foliage.h b/game/scenary/foliage.h
new file mode 100644
index 0000000..b85aab2
--- /dev/null
+++ b/game/scenary/foliage.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "assetFactory/asset.h"
+
+class SceneShader;
+class ShadowMapper;
+class Location;
+class Texture;
+
+class Foliage : public Asset, public StdTypeDefs<Foliage> {
+ Mesh::Ptr bodyMesh;
+ std::shared_ptr<Texture> texture;
+
+public:
+ void render(const SceneShader &, const Location &) const;
+ void shadows(const ShadowMapper &, const Location &) const;
+
+protected:
+ friend Persistence::SelectionPtrBase<std::shared_ptr<Foliage>>;
+ bool persist(Persistence::PersistenceStore & store) override;
+ void postLoad() override;
+};
diff --git a/game/scenary/plant.cpp b/game/scenary/plant.cpp
new file mode 100644
index 0000000..2b01bee
--- /dev/null
+++ b/game/scenary/plant.cpp
@@ -0,0 +1,13 @@
+#include "plant.h"
+
+void
+Plant::render(const SceneShader & shader) const
+{
+ type->render(shader, position);
+}
+
+void
+Plant::shadows(const ShadowMapper & mapper) const
+{
+ type->shadows(mapper, position);
+}
diff --git a/game/scenary/plant.h b/game/scenary/plant.h
new file mode 100644
index 0000000..55acca1
--- /dev/null
+++ b/game/scenary/plant.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "foliage.h"
+#include "game/worldobject.h"
+#include "gfx/renderable.h"
+#include "location.hpp"
+
+class Plant : public Renderable, public WorldObject {
+ std::shared_ptr<const Foliage> type;
+ Location position;
+
+ void render(const SceneShader & shader) const override;
+ void shadows(const ShadowMapper & shadowMapper) const override;
+
+ void
+ tick(TickDuration) override
+ {
+ }
+
+public:
+ Plant(std::shared_ptr<const Foliage> type, Location position) : type(std::move(type)), position(position) { }
+};
diff --git a/game/vehicles/railVehicleClass.cpp b/game/vehicles/railVehicleClass.cpp
index 4e9263c..b7a3b1e 100644
--- a/game/vehicles/railVehicleClass.cpp
+++ b/game/vehicles/railVehicleClass.cpp
@@ -2,7 +2,6 @@
#include "gfx/gl/sceneShader.h"
#include "gfx/gl/shadowMapper.h"
#include "gfx/models/mesh.h"
-#include "gfx/models/obj.h"
#include "gfx/models/texture.h"
#include <algorithm>
#include <array>
@@ -22,25 +21,6 @@
#include <utility>
#include <vector>
-RailVehicleClass::RailVehicleClass(const std::string & name) :
- RailVehicleClass {std::make_unique<ObjParser>(Resource::mapPath(name + ".obj")),
- Texture::cachedTexture.get(Resource::mapPath(name + ".png"))}
-{
-}
-
-RailVehicleClass::RailVehicleClass(std::unique_ptr<ObjParser> o, std::shared_ptr<Texture> t) :
- texture {std::move(t)}, maxSpeed(95._mph)
-{
- wheelBase = bogieOffset(*o);
- length = objectLength(*o);
- const auto m = o->createMeshes();
- bodyMesh = m.at("Body");
- bogies[0] = m.at("Bogie1");
- bogies[1] = m.at("Bogie2");
-}
-
-RailVehicleClass::RailVehicleClass() { }
-
bool
RailVehicleClass::persist(Persistence::PersistenceStore & store)
{
@@ -80,36 +60,3 @@ RailVehicleClass::shadows(
bogies[b]->Draw();
}
}
-
-float
-RailVehicleClass::bogieOffset(ObjParser & o)
-{
- float wheelBase {0};
- // offset bogie positions so they can be set directly
- for (auto & object : o.objects) { // bogie object index
- if (!object.first.starts_with("Bogie")) {
- continue;
- }
- std::set<std::pair<float, std::size_t>> vertexIds;
- for (const auto & face : object.second) {
- for (const auto & faceElement : face) {
- vertexIds.emplace(o.vertices[faceElement.x - 1].y, faceElement.x - 1);
- }
- }
- const auto offset = (vertexIds.begin()->first + vertexIds.rbegin()->first) / 2;
- for (const auto & v : vertexIds) {
- o.vertices[v.second].y -= offset;
- }
- wheelBase += std::abs(offset);
- }
- return wheelBase;
-}
-
-float
-RailVehicleClass::objectLength(ObjParser & o)
-{
- const auto mme = std::minmax_element(o.vertices.begin(), o.vertices.end(), [](const auto & v1, const auto & v2) {
- return v1.y < v2.y;
- });
- return mme.second->y - mme.first->y;
-}
diff --git a/game/vehicles/railVehicleClass.h b/game/vehicles/railVehicleClass.h
index 61ec4ec..1a52e2b 100644
--- a/game/vehicles/railVehicleClass.h
+++ b/game/vehicles/railVehicleClass.h
@@ -9,14 +9,10 @@
class SceneShader;
class ShadowMapper;
class Texture;
-class ObjParser;
class Location;
class RailVehicleClass : public Asset {
public:
- explicit RailVehicleClass(const std::string & name);
- RailVehicleClass();
-
void render(const SceneShader &, const Location &, const std::array<Location, 2> &) const;
void shadows(const ShadowMapper &, const Location &, const std::array<Location, 2> &) const;
@@ -31,10 +27,5 @@ protected:
friend Persistence::SelectionPtrBase<std::shared_ptr<RailVehicleClass>>;
bool persist(Persistence::PersistenceStore & store) override;
void postLoad() override;
-
-private:
- RailVehicleClass(std::unique_ptr<ObjParser> obj, std::shared_ptr<Texture>);
- static float bogieOffset(ObjParser & o);
- static float objectLength(ObjParser & o);
};
using RailVehicleClassPtr = std::shared_ptr<RailVehicleClass>;