Advertisement
Guest User

Irrlicht CGridSceneNode.cpp

a guest
Dec 13th, 2012
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.98 KB | None | 0 0
  1. #include "CGridSceneNode.h"
  2. #include "ISceneManager.h"
  3. #include "IVideoDriver.h"
  4.  
  5. namespace irr
  6. {
  7. namespace scene
  8. {
  9. CGridSceneNode::CGridSceneNode(ISceneNode* parent, ISceneManager* smgr, s32 id,
  10.         u32 spacing, u32 size, video::SColor gridcolor, u32 accentlineoffset,
  11.         video::SColor accentgridcolor, bool axislinestate)  : ISceneNode(parent, smgr, id),
  12.         m_spacing(spacing), m_size(size),
  13.         m_gridcolor(gridcolor), m_accentgridcolor(accentgridcolor),
  14.         m_accentlineoffset(accentlineoffset), m_AxisLineState(axislinestate),
  15.         m_XLineColor(video::SColor(255,255,0,0)), m_ZLineColor(video::SColor(255,0,0,255)), m_YLineColor(video::SColor(255,0,255,0)),
  16.         m_buffer(std::make_shared<irr::scene::CMeshBuffer<irr::video::S3DVertex>>(DeviceContainer::driver->getVertexDescriptor(0)))
  17. {
  18.     // Set the material
  19.     m_buffer->Material.Wireframe = false;
  20.     m_buffer->Material.Lighting = false;
  21.     m_buffer->Material.Thickness = 1;
  22.     m_buffer->Material.FogEnable = false;
  23.     m_buffer->Material.ZWriteEnable = false;
  24.     m_buffer->Material.BackfaceCulling = true;
  25.     m_buffer->Material.AntiAliasing = true;
  26.  
  27.     // Set the default culling state to Frustum Box
  28.     AutomaticCullingState = EAC_FRUSTUM_BOX;
  29.  
  30.     RegenerateGrid();
  31. }
  32.  
  33. CGridSceneNode* CGridSceneNode::clone(ISceneNode *newParent, ISceneManager *newSceneManager)
  34. {
  35.     if (!newParent) newParent = Parent;
  36.     if (!newSceneManager) newSceneManager = SceneManager;
  37.  
  38.     CGridSceneNode* clone = new CGridSceneNode(
  39.         Parent,
  40.         SceneManager,
  41.         ID,
  42.         m_spacing,
  43.         m_size*2,
  44.         m_gridcolor,
  45.         m_accentlineoffset,
  46.         m_accentgridcolor,
  47.         m_AxisLineState);
  48.  
  49.     if (!clone)
  50.         return 0x0;
  51.  
  52.     clone->SetAxisLineXColor(m_XLineColor);
  53.     clone->SetAxisLineZColor(m_ZLineColor);
  54.     clone->SetMaterial(m_buffer->Material);
  55.  
  56.     clone->drop();
  57.     return clone;
  58. }
  59.  
  60. void CGridSceneNode::OnRegisterSceneNode()
  61. {
  62.     if (IsVisible)
  63.         SceneManager->registerNodeForRendering(this);
  64.  
  65.     ISceneNode::OnRegisterSceneNode();
  66. }
  67.  
  68. void CGridSceneNode::RegenerateGrid()
  69. {
  70.     //Clean up memory
  71.     m_buffer->getIndexBuffer()->clear();
  72.     m_buffer->getVertexBuffer()->clear();
  73.  
  74.     u32 m_numVertices = ((m_size / m_spacing) + 1) * 2 * 2;
  75.     if (m_accentlineoffset) m_numVertices += ((m_size / (m_spacing * m_accentlineoffset)) + 1) * 2 * 2;
  76.  
  77.     if ( m_numVertices > 65535)
  78.     {
  79.         //Too many vertices on 16 bit for for 16bit indices of SMeshBuffer
  80.         //Returning with a blank buffer to avoid segfaulting the entire application
  81.         return;
  82.     }
  83.  
  84.     //Set our left corner
  85.     core::vector3df leftMost = core::vector3df(0,0,0);
  86.     leftMost.X -= m_size/2;
  87.     leftMost.Z -= m_size/2;
  88.  
  89.     //Set our right corner
  90.     core::vector3df rightMost = core::vector3df(0,0,0);
  91.     rightMost.X += m_size/2;
  92.     rightMost.Z += m_size/2;
  93.  
  94.     u32 indexIndex = 0;
  95.  
  96.     //X-axis lines
  97.     for (u32 x = 0; x <= m_size; x+= m_spacing)
  98.     {
  99.         core::vector3df start = leftMost;
  100.         start.X += x ;
  101.  
  102.         core::vector3df end = rightMost;
  103.         end.X = start.X;
  104.  
  105.         m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(start, core::vector3df(0,1,0), m_gridcolor, core::vector2df(0.0f, 0.0f)));
  106.         m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(end, core::vector3df(0,1,0), m_gridcolor, core::vector2df(0.0f, 0.0f)));
  107.  
  108.         m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  109.         m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  110.     }
  111.  
  112.     //Z-axis lines
  113.     for (u32 z = 0; z <= m_size; z+= m_spacing)
  114.     {
  115.         core::vector3df start = leftMost;
  116.         start.Z += z ;
  117.  
  118.         core::vector3df end = rightMost;
  119.         end.Z = start.Z;
  120.  
  121.         m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(start, core::vector3df(0,1,0), m_gridcolor, core::vector2df(0.0f, 0.0f)));
  122.         m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(end, core::vector3df(0,1,0), m_gridcolor, core::vector2df(0.0f, 0.0f)));
  123.  
  124.         m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  125.         m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  126.     }
  127.  
  128.     //Accent lines are only drawn if the offset is greater than 0
  129.     if (m_accentlineoffset > 0)
  130.     {
  131.         //X-axis
  132.         for (u32 x = 0; x <= m_size; x+= m_spacing*m_accentlineoffset)
  133.         {
  134.             core::vector3df start = leftMost;
  135.             start.X += x ;
  136.  
  137.             core::vector3df end = rightMost;
  138.             end.X = start.X;
  139.  
  140.             m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(start, core::vector3df(0,1,0), m_accentgridcolor, core::vector2df(0.0f, 0.0f)));
  141.             m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(end, core::vector3df(0,1,0), m_accentgridcolor, core::vector2df(0.0f, 0.0f)));
  142.  
  143.             m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  144.             m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  145.         }
  146.  
  147.         //Z-axis
  148.         for (u32 z = 0; z <= m_size; z+= m_spacing*m_accentlineoffset)
  149.         {
  150.             core::vector3df start = leftMost;
  151.             start.Z += z ;
  152.  
  153.             core::vector3df end = rightMost;
  154.             end.Z = start.Z;
  155.             m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(start, core::vector3df(0,1,0), m_accentgridcolor, core::vector2df(0.0f, 0.0f)));
  156.             m_buffer->getVertexBuffer()->addVertex(&video::S3DVertex(end, core::vector3df(0,1,0), m_accentgridcolor, core::vector2df(0.0f, 0.0f)));
  157.  
  158.             m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  159.             m_buffer->getIndexBuffer()->addIndex(indexIndex++);
  160.         }
  161.     }
  162.  
  163.  
  164.     // Create our box, it is the size of the grid exactly, plus 1 in the Y axis
  165.     m_buffer->BoundingBox = core::aabbox3df(-(f32)m_size/2,-0.5f,-(f32)m_size/2,(f32)m_size/2,0.5f,(f32)m_size/2);
  166. }
  167.  
  168. void CGridSceneNode::render()
  169. {
  170.     video::IVideoDriver* driver = SceneManager->getVideoDriver();
  171.  
  172.     //Prep to render
  173.     if (driver)
  174.     {
  175.         driver->setMaterial(m_buffer->Material);
  176.         driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
  177.  
  178.         driver->drawVertexPrimitiveList(false, m_buffer->getVertexBuffer(), false, m_buffer->getIndexBuffer(), m_buffer->getVertexBuffer()->getVertexCount()/2, scene::EPT_LINES);
  179.        
  180.         // Axis Lines are only drawn if the State is true
  181.         if (m_AxisLineState)
  182.         {
  183.             m_buffer->Material.Thickness = 3;
  184.             driver->setMaterial(m_buffer->Material);
  185.             driver->draw3DLine(core::vector3df(0,0,0),core::vector3df(0.5f,0,0), m_XLineColor);
  186.             driver->draw3DLine(core::vector3df(0,0,0),core::vector3df(0,0.5f,0), m_YLineColor);
  187.             driver->draw3DLine(core::vector3df(0,0,0),core::vector3df(0,0,0.5f), m_ZLineColor);
  188.             m_buffer->Material.Thickness = 1;
  189.             driver->setMaterial(m_buffer->Material);
  190.         }
  191.     }
  192. }
  193.  
  194. const core::aabbox3d<f32>& CGridSceneNode::getBoundingBox() const
  195. {
  196.     return m_buffer->BoundingBox;
  197. }
  198.  
  199. u32 CGridSceneNode::getMaterialCount()
  200. {
  201.     return 1;
  202. }
  203.  
  204. video::SMaterial& CGridSceneNode::getMaterial(u32 i)
  205. {
  206.     return m_buffer->Material;
  207. }
  208.  
  209. u32 CGridSceneNode::GetSpacing()
  210. {
  211.     return m_spacing;
  212. }
  213.  
  214. u32 CGridSceneNode::GetSize()
  215. {
  216.     return m_size;
  217. }
  218.  
  219. u32 CGridSceneNode::GetAccentlineOffset()
  220. {
  221.     return m_accentlineoffset;
  222. }
  223.  
  224. video::SColor CGridSceneNode::GetAccentlineColor()
  225. {
  226.     return m_accentgridcolor;
  227. }
  228.  
  229. video::SColor CGridSceneNode::GetGridColor()
  230. {
  231.     return m_gridcolor;
  232. }
  233.  
  234. bool CGridSceneNode::AreAxisLineActive()
  235. {
  236.     return m_AxisLineState;
  237. }
  238.  
  239. video::SColor CGridSceneNode::GetAxisLineXColor()
  240. {
  241.     return m_XLineColor;
  242. }
  243.  
  244. video::SColor CGridSceneNode::GetAxisLineZColor()
  245. {
  246.     return m_ZLineColor;
  247. }
  248.  
  249. void CGridSceneNode::SetSpacing(u32 newspacing)
  250. {
  251.     m_spacing = newspacing;
  252.     RegenerateGrid();
  253. }
  254.  
  255. void CGridSceneNode::SetSize(u32 newsize)
  256. {
  257.     m_size = newsize;
  258.     RegenerateGrid();
  259. }
  260.  
  261. void CGridSceneNode::SetAccentlineColor(video::SColor newcolor)
  262. {
  263.     m_accentgridcolor = newcolor;
  264.     RegenerateGrid();
  265. }
  266.  
  267. void CGridSceneNode::SetAccentlineOffset(u32 newoffset)
  268. {
  269.     m_accentlineoffset = newoffset;
  270.     RegenerateGrid();
  271. }
  272.  
  273. void CGridSceneNode::SetGridColor(video::SColor newcolor)
  274. {
  275.     m_gridcolor = newcolor;
  276.     RegenerateGrid();
  277. }
  278.  
  279. void CGridSceneNode::SetAxisLineActive(bool active)
  280. {
  281.     m_AxisLineState = active;
  282. }
  283.  
  284. void CGridSceneNode::SetAxisLineXColor(video::SColor XLine)
  285. {
  286.     m_XLineColor = XLine;
  287. }
  288.  
  289. void CGridSceneNode::SetAxisLineZColor(video::SColor ZLine)
  290. {
  291.     m_ZLineColor = ZLine;
  292. }
  293.  
  294. void CGridSceneNode::SetMaterial(video::SMaterial newMaterial)
  295. {
  296.     m_buffer->Material = newMaterial;
  297. }
  298. };
  299. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement