Changeset 7297892 in opengl-game for vulkan-game.hpp


Ignore:
Timestamp:
Apr 19, 2020, 4:06:03 AM (5 years ago)
Author:
Dmitry Portnoy <dmitry.portnoy@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
73a10ca
Parents:
3950236
Message:

Make lasers deal damage to asteroids and eventually destroy them

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.hpp

    r3950236 r7297892  
    107107static float curTime;
    108108
     109
     110// TODO: Look into using dynamic_cast to check types of SceneObject and EffectOverTime
     111
     112struct BaseEffectOverTime {
     113   bool deleted;
     114
     115   virtual void applyEffect() = 0;
     116
     117   BaseEffectOverTime() :
     118         deleted(false) {
     119   }
     120
     121   virtual ~BaseEffectOverTime() {
     122   }
     123};
     124
     125template<class VertexType, class SSBOType>
     126struct EffectOverTime : public BaseEffectOverTime {
     127   GraphicsPipeline_Vulkan<VertexType, SSBOType>& pipeline;
     128   vector<SceneObject<VertexType, SSBOType>>& objects;
     129   unsigned int objectIndex;
     130   size_t effectedFieldOffset;
     131   float startValue;
     132   float startTime;
     133   float changePerSecond;
     134
     135   EffectOverTime(GraphicsPipeline_Vulkan<VertexType, SSBOType>& pipeline,
     136         vector<SceneObject<VertexType, SSBOType>>& objects, unsigned int objectIndex,
     137         size_t effectedFieldOffset, float changePerSecond) :
     138         pipeline(pipeline),
     139         objects(objects),
     140         objectIndex(objectIndex),
     141         effectedFieldOffset(effectedFieldOffset),
     142         startTime(curTime),
     143         changePerSecond(changePerSecond) {
     144      size_t ssboOffset = offset_of(&SceneObject<VertexType, SSBOType>::ssbo);
     145
     146      unsigned char* effectedFieldPtr = reinterpret_cast<unsigned char*>(&objects[objectIndex]) +
     147         ssboOffset + effectedFieldOffset;
     148
     149      startValue = *reinterpret_cast<float*>(effectedFieldPtr);
     150   }
     151
     152   void applyEffect() {
     153      if (objects[objectIndex].ssbo.deleted) {
     154         this->deleted = true;
     155         return;
     156      }
     157
     158      size_t ssboOffset = offset_of(&SceneObject<VertexType, SSBOType>::ssbo);
     159
     160      unsigned char* effectedFieldPtr = reinterpret_cast<unsigned char*>(&objects[objectIndex]) +
     161         ssboOffset + effectedFieldOffset;
     162
     163      *reinterpret_cast<float*>(effectedFieldPtr) = startValue + (curTime - startTime) * changePerSecond;
     164
     165      objects[objectIndex].modified = true;
     166   }
     167};
     168
    109169class VulkanGame {
    110170   public:
     
    226286      UBO_VP_mats laser_VP_mats;
    227287
     288      vector<BaseEffectOverTime*> effects;
     289
    228290      time_point<steady_clock> startTime;
    229291      float prevTime, elapsedTime;
     
    236298
    237299      unsigned int leftLaserIdx = -1;
     300      EffectOverTime<AsteroidVertex, SSBO_Asteroid>* leftLaserEffect = nullptr;
    238301
    239302      unsigned int rightLaserIdx = -1;
     303      EffectOverTime<AsteroidVertex, SSBO_Asteroid>* rightLaserEffect = nullptr;
    240304
    241305      bool initWindow(int width, int height, unsigned char guiFlags);
Note: See TracChangeset for help on using the changeset viewer.