1 // Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _STATICGEOMETRY_H
5 #define _STATICGEOMETRY_H
6 /*
7  * Geometry node containing one or more meshes.
8  */
9 #include "Aabb.h"
10 #include "Node.h"
11 #include "graphics/Renderer.h"
12 #include "graphics/VertexBuffer.h"
13 #include "libs.h"
14 
15 namespace SceneGraph {
16 
17 	class NodeVisitor;
18 
19 	class StaticGeometry : public Node {
20 	public:
21 		struct Mesh {
22 			RefCountedPtr<Graphics::VertexBuffer> vertexBuffer;
23 			RefCountedPtr<Graphics::IndexBuffer> indexBuffer;
24 			RefCountedPtr<Graphics::Material> material;
25 		};
26 		StaticGeometry(Graphics::Renderer *r);
27 		StaticGeometry(const StaticGeometry &, NodeCopyCache *cache = 0);
28 		virtual Node *Clone(NodeCopyCache *cache = 0) override;
GetTypeName()29 		virtual const char *GetTypeName() const override { return "StaticGeometry"; }
30 		virtual void Accept(NodeVisitor &nv) override;
31 		virtual void Render(const matrix4x4f &trans, const RenderData *rd) override;
32 		virtual void Render(const std::vector<matrix4x4f> &trans, const RenderData *rd) override;
33 
34 		virtual void Save(NodeDatabase &) override;
35 		static StaticGeometry *Load(NodeDatabase &);
36 
37 		void AddMesh(RefCountedPtr<Graphics::VertexBuffer>,
38 			RefCountedPtr<Graphics::IndexBuffer>,
39 			RefCountedPtr<Graphics::Material>);
GetNumMeshes()40 		unsigned int GetNumMeshes() const { return static_cast<Uint32>(m_meshes.size()); }
41 		Mesh &GetMeshAt(unsigned int i);
42 
SetRenderState(Graphics::RenderState * s)43 		void SetRenderState(Graphics::RenderState *s) { m_renderState = s; }
44 
45 		Aabb m_boundingBox;
46 		Graphics::BlendMode m_blendMode;
47 
48 	protected:
49 		~StaticGeometry();
50 		void DrawBoundingBox(const Aabb &bb);
51 		std::vector<Mesh> m_meshes;
52 		std::vector<RefCountedPtr<Graphics::Material>> m_instanceMaterials;
53 		Graphics::RenderState *m_renderState;
54 		RefCountedPtr<Graphics::InstanceBuffer> m_instBuffer;
55 	};
56 
57 } // namespace SceneGraph
58 #endif
59