]> git.localhorst.tv Git - blank.git/commitdiff
use entity's eyes to aim
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 19 Oct 2015 12:36:16 +0000 (14:36 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 19 Oct 2015 12:36:16 +0000 (14:36 +0200)
also squashed some assets

assets
src/app/app.cpp
src/client/client.cpp
src/graphics/Camera.hpp
src/graphics/viewport.cpp
src/model/Instance.hpp
src/model/Model.hpp
src/model/model.cpp
src/standalone/MasterState.cpp
src/world/Entity.hpp
src/world/world.cpp

diff --git a/assets b/assets
index 03a7d614b7e7e7c57c87b022b9bf76b09c5242fb..ed7b81207b13b87a3a9097b9e25ebd06aa814d97 160000 (submodule)
--- a/assets
+++ b/assets
@@ -1 +1 @@
-Subproject commit 03a7d614b7e7e7c57c87b022b9bf76b09c5242fb
+Subproject commit ed7b81207b13b87a3a9097b9e25ebd06aa814d97
index 22a3b586a1850a38d8ba11d45003754f3d05d05b..b3b330036b5e2f0c855266c0219dee023a2eebee 100644 (file)
@@ -527,6 +527,8 @@ void AssetLoader::LoadModels(
                        in.Skip(Token::EQUALS);
                        if (prop_name == "root") {
                                model.RootPart().Read(in, tex_index, shapes);
+                       } else if (prop_name == "eyes") {
+                               model.SetEyes(in.GetULong());
                        } else {
                                while (in.HasMore() && in.Peek().type != Token::SEMICOLON) {
                                        in.Next();
index 89e306bee60cb775dc1a61ff63b976f8a296a95a..97292a957f86466a228dbd24f1c45e28a20aae85 100644 (file)
@@ -65,6 +65,10 @@ InteractiveState::InteractiveState(MasterState &master, uint32_t player_id)
                save.Write(master.GetWorldConf());
        }
        res.Load(master.GetEnv().loader, "default");
+       if (res.models.size() < 1) {
+               throw std::runtime_error("need at least one model to run");
+       }
+       res.models[0].Instantiate(player.GetEntity().GetModel());
        sounds.Load(master.GetEnv().loader, res.snd_index);
        interface.SetInventorySlots(res.block_types.size() - 1);
        chunk_renderer.LoadTextures(master.GetEnv().loader, res.tex_index);
index 924b5b4bd320396ab28dbdb2dd3c710c28cdf91c..95175dee705a0a8544aa3c592e6efc3f68172c35 100644 (file)
@@ -19,7 +19,7 @@ public:
 
        const glm::mat4 &Projection() const noexcept { return projection; }
        const glm::mat4 &View() const noexcept { return view; }
-       void View(const glm::mat4 &v) noexcept { view = v; }
+       void View(const glm::mat4 &v) noexcept;
 
 private:
        void UpdateProjection() noexcept;
index ad58b58be677d033962a2687d88f961e6ebe71e1..e1719668eab185b4bf27b200de5d8d45d5a99f08 100644 (file)
@@ -45,6 +45,9 @@ void Camera::Clip(float n, float f) noexcept {
        UpdateProjection();
 }
 
+void Camera::View(const glm::mat4 &v) noexcept {
+       view = v;
+}
 
 void Camera::UpdateProjection() noexcept {
        projection = glm::perspective(fov, aspect, near, far);
@@ -256,7 +259,9 @@ BlendedSprite &Viewport::SpriteProgram() noexcept {
 
 
 void Viewport::WorldPosition(const glm::mat4 &t) noexcept {
-       cam.View(glm::inverse(t));
+       const glm::vec3 offset(0.0f, 0.0f, 0.0f);
+       //const glm::vec3 offset(0.0f, 0.0f, -5.0f);
+       cam.View(glm::translate(glm::inverse(t), glm::vec3(t * glm::vec4(offset, 0.0f))));
        ChunkProgram().SetView(cam.View());
        sky_prog.Activate();
        SkyBoxProgram().SetView(cam.View());
index 8b94bcd8c20ac0fc6a53de887201ecd5fa5b2748..09ab78e368835998a09978d2be12c6620036a26c 100644 (file)
@@ -26,6 +26,8 @@ public:
        operator bool() const noexcept { return model; }
        const Model &GetModel() const noexcept { return *model; }
 
+       glm::mat4 EyesTransform() const noexcept;
+
        void Render(const glm::mat4 &, DirectionalLighting &);
 
 private:
index c46caf442740cb7efec78a4aad27087339faf705..55a9734381a7e68ad453f94f1e51ce489fdce748 100644 (file)
@@ -31,6 +31,10 @@ public:
        Part &GetPart(std::size_t i) noexcept { return *part[i]; }
        const Part &GetPart(std::size_t i) const noexcept { return *part[i]; }
 
+       void SetEyes(std::uint16_t id) { eyes_id = id; }
+
+       const Part &GetEyesPart() const noexcept { return GetPart(eyes_id); }
+
        void Enumerate();
        void Instantiate(Instance &) const;
 
@@ -38,6 +42,7 @@ private:
        std::uint32_t id;
        Part root;
        std::vector<Part *> part;
+       std::uint16_t eyes_id;
 
 };
 
index 55050e0b72d856ce57894787705c0630cbc981a3..451433bc7e8296d38b37c551883598553ab13248 100644 (file)
@@ -27,6 +27,10 @@ Instance::~Instance() {
 
 }
 
+glm::mat4 Instance::EyesTransform() const noexcept {
+       return model->GetEyesPart().GlobalTransform(*this);
+}
+
 void Instance::Render(const glm::mat4 &M, DirectionalLighting &prog) {
        model->RootPart().Render(M, *this, prog);
 }
@@ -35,7 +39,8 @@ void Instance::Render(const glm::mat4 &M, DirectionalLighting &prog) {
 Model::Model()
 : id(0)
 , root()
-, part() {
+, part()
+, eyes_id(0) {
 
 }
 
index 3695b201c71f83ec8764c17ec7f02f9786dcfb19..1035bb23688da035893c3a10fdd8e687a9190b79 100644 (file)
@@ -42,8 +42,9 @@ MasterState::MasterState(
        if (res.models.size() < 2) {
                throw std::runtime_error("need at least two models to run");
        }
+       res.models[0].Instantiate(player.GetEntity().GetModel());
        sounds.Load(env.loader, res.snd_index);
-       spawner.LimitModels(0, res.models.size());
+       spawner.LimitModels(1, res.models.size());
        interface.SetInventorySlots(res.block_types.size() - 1);
        generator.LoadTypes(res.block_types);
        chunk_renderer.LoadTextures(env.loader, res.tex_index);
@@ -131,7 +132,9 @@ void MasterState::Update(int dt) {
 }
 
 void MasterState::Render(Viewport &viewport) {
-       viewport.WorldPosition(player.GetEntity().Transform(player.GetEntity().ChunkCoords()));
+       viewport.WorldPosition(
+               player.GetEntity().Transform(player.GetEntity().ChunkCoords())
+               * player.GetEntity().GetModel().EyesTransform());
        if (config.video.world) {
                chunk_renderer.Render(viewport);
                world.Render(viewport);
index 7e85591c89150f1c22e6a20604cca20a7c6eccca..0a443031d13627c291586c06baec8dad4ba13a76 100644 (file)
@@ -63,9 +63,11 @@ public:
        const glm::quat &Orientation() const noexcept { return state.orient; }
        void Orientation(const glm::quat &o) noexcept { state.orient = o; }
 
-       glm::mat4 Transform(const glm::ivec3 &reference) const noexcept {
-               return state.Transform(reference);
-       }
+       /// get a transform for this entity's coordinate space
+       glm::mat4 Transform(const glm::ivec3 &reference) const noexcept;
+       /// get a transform for this entity's view space
+       glm::mat4 ViewTransform(const glm::ivec3 &reference) const noexcept;
+       /// get a ray in entity's face direction originating from center of vision
        Ray Aim(const Chunk::Pos &chunk_offset) const noexcept;
 
        void SetState(const EntityState &s) noexcept { state = s; }
index 15f1cabae2a124ff6eaa8e61baf1f0087b8fce89..349b82d00233e5d67fe3d6a6a1d7aa3f178ffde3 100644 (file)
@@ -45,8 +45,20 @@ void Entity::Position(const glm::vec3 &pos) noexcept {
        state.AdjustPosition();
 }
 
+glm::mat4 Entity::Transform(const glm::ivec3 &reference) const noexcept {
+       return state.Transform(reference);
+}
+
+glm::mat4 Entity::ViewTransform(const glm::ivec3 &reference) const noexcept {
+       glm::mat4 transform = Transform(reference);
+       if (model) {
+               transform *= model.EyesTransform();
+       }
+       return transform;
+}
+
 Ray Entity::Aim(const Chunk::Pos &chunk_offset) const noexcept {
-       glm::mat4 transform = Transform(chunk_offset);
+       glm::mat4 transform = ViewTransform(chunk_offset);
        glm::vec4 from = transform * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
        from /= from.w;
        glm::vec4 to = transform * glm::vec4(0.0f, 0.0f, -1.0f, 1.0f);