Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. #pragma once
  2. #include "Program.h"
  3.  
  4. extern E_DRIVER_TYPE driverType;
  5. extern IrrlichtDevice *device;
  6. extern IVideoDriver *driver;
  7. extern ISceneManager *sceneManager;
  8. extern IFileSystem *fileSystem;
  9. extern const stringc DATA_DIR;
  10.  
  11. class Model
  12. {
  13. private:
  14.     IAnimatedMesh *mesh;
  15.     ISceneNode *node;
  16.     bool scene; // jos true, ollaan ladattu .irr filu.
  17.  
  18. public:
  19.     Model() : mesh(0), node(0), scene(false) {}
  20.  
  21.     void clear()
  22.     {
  23.         if(node!=0)
  24.         {
  25.             node->removeAll();  // remove children
  26.             node->remove();     // remove this
  27.         }
  28.         node=0;
  29.         mesh=0;
  30.     }
  31.  
  32.     void createEmpty()
  33.     {
  34.         node = sceneManager->addEmptySceneNode();
  35.     }
  36.  
  37.     bool load(stringc fileName)
  38.     {
  39.         fileName = DATA_DIR + fileName;
  40.  
  41.         // tsekkaa onko nimessä .irr
  42.         if(fileName.find(".irr")!=-1) // löyty
  43.         {
  44.             scene=true;
  45.             node = sceneManager->addEmptySceneNode();
  46.             bool b=sceneManager->loadScene(fileName.c_str(), 0, node);
  47.             if(b==false)
  48.                 throw "Load failed!";
  49.         }
  50.         else
  51.         {
  52.             mesh=sceneManager->getMesh(fileName.c_str());
  53.             if(mesh==0)
  54.                 throw "Load failed!";
  55.             else
  56.                 node = sceneManager->addAnimatedMeshSceneNode(mesh);
  57.         }
  58.  
  59.         return true;
  60.     }
  61.  
  62.     void move(float speed, float Y_FIX=-90)
  63.     {
  64.         vector3df v = node->getPosition();
  65.         vector3df r = node->getRotation();
  66.         r.Y += Y_FIX; // tässä korjataan noden asento että obu liikkuu oikeaan suuntaan
  67.         v.X = v.X + (float)((cos(r.Y * PI / 180) * speed));
  68.         v.Z = v.Z - (float)(sin(r.Y * PI / 180) * speed);
  69.         node->setPosition(v);
  70.     }
  71.  
  72.     void rotate(float x, float y, float z)
  73.     {
  74.         vector3df r=node->getRotation();
  75.         r += vector3df(x,y,z);
  76.         node->setRotation(r);
  77.     }
  78.  
  79.     ISceneNode *getNode()
  80.     {
  81.         return node;
  82.     }
  83.  
  84.     IAnimatedMeshSceneNode *getAnimatedNode()
  85.     {
  86.         return (IAnimatedMeshSceneNode*)node;
  87.     }
  88.  
  89.     void createCollisionResponseAnimator(IMetaTriangleSelector *meta)
  90.     {
  91.         vector3df s = node->getBoundingBox().getExtent() * node->getScale();
  92.  
  93.         ISceneNodeAnimator* anim = sceneManager->createCollisionResponseAnimator(meta, node,
  94.             vector3df(s.X/3.f, s.Y/2.f, s.Z/3.f), vector3df(0,-0.01f,0), vector3df(0,-s.Y/2.f, 0), 0.0007f);
  95.  
  96.         node->addAnimator(anim);
  97.         anim->drop();
  98.     }
  99.  
  100.     s32 loadShader(stringc name, IShaderConstantSetCallBack *shaderCallback = 0, s32 userdata = 0)
  101.     {
  102.         IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
  103.         if(!gpu) return -1;
  104.  
  105.         stringc file = DATA_DIR + "Shaders/" + name;
  106.  
  107.         if(driverType == EDT_OPENGL)
  108.             return gpu->addHighLevelShaderMaterialFromFiles(
  109.                 (file + ".vert").c_str(), "main_v", EVST_VS_2_0,
  110.                 (file + ".frag").c_str(), "main_f", EPST_PS_2_0,
  111.                 shaderCallback, video::EMT_SOLID, userdata, EGSL_DEFAULT);
  112.         else
  113.             return gpu->addHighLevelShaderMaterialFromFiles(
  114.                 (file + ".hlsl").c_str(), "main_v", EVST_VS_2_0,
  115.                 (file + ".hlsl").c_str(), "main_f", EPST_PS_2_0,
  116.                 shaderCallback, video::EMT_SOLID, userdata, EGSL_DEFAULT);
  117.     }
  118.  
  119.     void useShader(s32 shader)
  120.     {
  121.         if(scene)
  122.         {
  123.             core::array<scene::ISceneNode *> nodes;
  124.             sceneManager->getSceneNodesFromType(ESNT_MESH, nodes);
  125.             for (u32 i=0; i < nodes.size(); ++i)
  126.                 nodes[i]->setMaterialType((E_MATERIAL_TYPE)shader);
  127.         }
  128.         else
  129.             node->setMaterialType((E_MATERIAL_TYPE)shader);
  130.     }
  131.  
  132.     void setMaterialFlag(E_MATERIAL_FLAG flag, bool newvalue)
  133.     {
  134.         if(scene)
  135.         {
  136.             core::array<scene::ISceneNode *> nodes;
  137.             sceneManager->getSceneNodesFromType(ESNT_MESH, nodes);
  138.             for (u32 i=0; i < nodes.size(); ++i)
  139.                 nodes[i]->setMaterialFlag(flag, newvalue);
  140.  
  141.         }
  142.         else
  143.             node->setMaterialFlag(flag, newvalue);
  144.     }
  145.  
  146.  
  147.  
  148. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement