From d83cc6403ce6455463b7ffed48fba4c83748ca62 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 27 May 2016 10:56:24 +0200 Subject: [PATCH] Spawn objects from file --- CrystalPoint.vcxproj | 1 + CrystalPoint.vcxproj.filters | 3 +++ HeightMap.cpp | 21 +++++++++++++++++++-- HeightMap.h | 4 +++- World.cpp | 28 ++++++++++++++++++++++++++-- World.h | 5 +++++ worlds/small.json | 8 +++++++- worlds/small.png | Bin 3204 -> 2229 bytes 8 files changed, 64 insertions(+), 6 deletions(-) diff --git a/CrystalPoint.vcxproj b/CrystalPoint.vcxproj index f8cc70d..97671cc 100644 --- a/CrystalPoint.vcxproj +++ b/CrystalPoint.vcxproj @@ -184,6 +184,7 @@ + diff --git a/CrystalPoint.vcxproj.filters b/CrystalPoint.vcxproj.filters index e75e5d2..43a3b3d 100644 --- a/CrystalPoint.vcxproj.filters +++ b/CrystalPoint.vcxproj.filters @@ -118,5 +118,8 @@ Source Files\json + + Source Files\json + \ No newline at end of file diff --git a/HeightMap.cpp b/HeightMap.cpp index 042c229..f6752a6 100644 --- a/HeightMap.cpp +++ b/HeightMap.cpp @@ -2,12 +2,19 @@ #include "stb_image.h" #include "vector.h" +#include "LevelObject.h" + #include #include #include +#include "World.h" +#define RED 0 +#define GREEN 1 +#define BLUE 2 +#define ALPHA 3 -HeightMap::HeightMap(const std::string &file, float scale) +HeightMap::HeightMap(const std::string &file, float scale, World* world) { this->scale = scale; @@ -16,7 +23,12 @@ HeightMap::HeightMap(const std::string &file, float scale) auto heightAt = [&](int x, int y) { - return (imgData[(x + y * width) * 4] / 256.0f) * 100.0f; + return (imgData[(x + y * width) * 4 ] / 256.0f) * 100.0f; + }; + + auto valueAt = [&](int x, int y, int offset = 0) + { + return imgData[(x + y * width) * 4 + offset]; }; for (int y = 0; y < height-1; y++) @@ -27,6 +39,11 @@ HeightMap::HeightMap(const std::string &file, float scale) Vec3f ca(0, heightAt(x, y + 1) - heightAt(x, y), 1); Vec3f ba(1, heightAt(x + 1, y) - heightAt(x, y), 0); + if (valueAt(x, y, GREEN) > 0) + { + world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)), Vec3f(x*scale, heightAt(x, y), y*scale), Vec3f(0, rand()%360, 0), 1, true)); + } + Vec3f normal = ca.cross(ba); normal.Normalize(); diff --git a/HeightMap.h b/HeightMap.h index 4c3c445..0f3a141 100644 --- a/HeightMap.h +++ b/HeightMap.h @@ -5,6 +5,8 @@ #include #include +class World; + class HeightMap { private: @@ -14,7 +16,7 @@ private: GLuint imageIndex; int scale; public: - HeightMap(const std::string &file, float scale); + HeightMap(const std::string &file, float scale, World* world); ~HeightMap(); void Draw(); diff --git a/World.cpp b/World.cpp index a2d54ad..1a9e533 100644 --- a/World.cpp +++ b/World.cpp @@ -1,7 +1,6 @@ #include "World.h" #include #include "Entity.h" -#include "LevelObject.h" #include "json.h" #include "Model.h" #include @@ -18,18 +17,27 @@ World::World(const std::string &fileName) json::Value v = json::readJson(file); file.close(); + //Check file if(v["world"].isNull() || v["world"]["heightmap"].isNull()) std::cout << "Invalid world file: world - " << fileName << "\n"; if (v["player"].isNull() || v["player"]["startposition"].isNull()) std::cout << "Invalid world file: player - " << fileName << "\n"; if (v["objects"].isNull()) std::cout << "Invalid world file: objects - " << fileName << "\n"; + if (v["world"]["object-templates"].isNull()) + std::cout << "Invalid world file: object templates - " << fileName << "\n"; float scale = 1.0f; if (!v["world"]["scale"].isNull()) scale = v["world"]["scale"].asFloat(); - heightmap = new HeightMap(v["world"]["heightmap"].asString(), scale); + //Load object templates + for (auto objt : v["world"]["object-templates"]) + { + objecttemplates.push_back(std::pair(objt["color"], objt["file"])); + } + + heightmap = new HeightMap(v["world"]["heightmap"].asString(), scale, this); if(!v["world"]["texture"].isNull()) heightmap->SetTexture(v["world"]["texture"].asString()); @@ -90,6 +98,17 @@ World::~World() delete heightmap; } +std::string World::getObjectFromValue(int val) +{ + for (auto i : objecttemplates) + { + if (i.first == val) + return i.second; + } + + return objecttemplates[0].second; +} + float World::getHeight(float x, float y) { return heightmap->GetHeight(x, y); @@ -152,6 +171,11 @@ void World::update(float elapsedTime) } } +void World::addLevelObject(LevelObject* obj) +{ + entities.push_back(obj); +} + bool World::isPlayerPositionValid() { for (auto e : entities) diff --git a/World.h b/World.h index 0df2a06..de9c803 100644 --- a/World.h +++ b/World.h @@ -4,11 +4,14 @@ #include "HeightMap.h" #include "Player.h" #include "Enemy.h" +#include "LevelObject.h" class Entity; class World { +private: + std::vector> objecttemplates; public: World(const std::string &fileName); ~World(); @@ -23,5 +26,7 @@ public: void update(float elapsedTime); bool isPlayerPositionValid(); float getHeight(float x, float y); + void addLevelObject(LevelObject* obj); + std::string getObjectFromValue(int i); }; diff --git a/worlds/small.json b/worlds/small.json index e69e432..bd9ab49 100644 --- a/worlds/small.json +++ b/worlds/small.json @@ -1,7 +1,13 @@ { "world": { "heightmap": "worlds/small.png", - "scale": 1 + "scale": 1, + "object-templates": [ + { + "color":100, + "file": "models/boom/Boom.obj" + } + ] }, "player": { "startposition": [ 20, 5, 20 ] diff --git a/worlds/small.png b/worlds/small.png index fd75ea182e43b333083afed8bde4b5d8c3a97377..72f885bc94e566db8a35c5670e8d363b8da49b79 100644 GIT binary patch delta 1525 zcmVn-?002y608wNBVPpVhWB_Yq0B>Xfc4Pp7004ym0EqwqjQ{|V005N$0GR*)od5u# z005-`0I2`~tpEV90050-0Fh(>nPdR1WB>pF00000000000JD7oyaAJd0mK>YE*{7L z000SaNLh0L01m+b01m+cxRGn^lTrgFe+4H=L_t(oM|GBqb{aVlL`AS;Y#vGW!5bXB zoBaPLZr!Su268rS7&!6Vs_K?TPW#krUZ20IIrWr!e*Rqb@=^jbZs5zE%!A?`Ui?d{ zO(b7_69aty6oqG1#}|u5d*XM#$?yMFu=t?yFB*ZuD@gIPd{p@t5_m3m3j|-heRIOI)hGEwj-zEw0;z{u0rE~Y@ z5l{wS3bj(`!3*yJUKbhua%J8E1&;vfrW7Wg31og0F#Nhzg^af)=)QQ^EJ1k3Urz#N zsWAi3PZw~kv;KGE3rlS#zH(RL-t(hi|L`oH@XbcA&8D(HR1cr{+WTTNf4}0_e@j8U z6t;CDiO{7QR~2sF?yum<&*~FE^k!>;g63a{EjE0*PkP$->ZO0Q22h1nsbLUsyn@7vf>dAb+-yime zLyP59pL3=2PQU$0_e`H3fBUP2ooH3_{q_VdYii=}hwpL+3UD|ckIgq{vk#W~7T(re z=-w;u1z-SDI37xE>T@CCM|0spVM#;d32=BzN=n)`!O4DbC;!mfB zCx{iOBtQW3!mIO6gENAYS}0@M8MCQUxj<^`li*kb@rkUHfMb1&k``KOD&v>wF?ct+kq!`$dpEKYI;mX zMJ9i-2+#1{IM$*Q96ZVOBUp8AJm}!?ed#jyOugEka$}o1>*v(;H_BCw)b!z}zHMH{ zCeN_Cs+1tK*8u@Pe|NRvhxag+=lT32>_w#^3OAhu$a(vaKo8txE>!I4eBnoRy>h)U z167vNl_7Y5O2E+mWne_U;HuYEbV>q%j_-Zs03=`r>fdv7)8%Y)^Y8H2ODop>$6qfe z*lyK7xU*v}L(uDcl@oM43Vj4#1kRjHUB>v)cc;I@PXcP>f8pRKfhJ(y>Fq6~H+E9E|Xvw-4j`7j}`hcC$MRZ`^b}hu#HD5P>v*6Hfr)8iD*dP%6FA zQ8|Dz0twjN5+6!%%Px|C5>)msz!?yJ3Q+doDkty&NT3ej&8ly+qB#e~2nZmF56XD* zi`QSKas1e|(5fr~y#1@B5dI|o&^!Xg2N!CAeu^B^e?k0He81=Stp{M|#ad^8X&xkv z@ZP@giP!%R#_`SAOisK4T;Ab-4&3ucAozaQ6L{?Zn7li;#UsG%z`Y@gKZ$4LEfb&v z9e_e@4eWC}9n|7kK{(^*J}+6*BC?9C0fU1Yc<-S2ZjZkLXwCFLJrdA?&Oh%Q!$xzC zC_r|vM|d6}6dWM@X3Y?*gT8X&aN(jo(Cv%2a38={&t4L2IDlEf1Tf3fRst2@4Geyd b|9br&HWl#ELfx1000000NkvXXu0mjfR=Lil delta 2689 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 v(Dh&Ljn)GUKF8