Geometry.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #pragma once
  4. #include "../Container/ArrayPtr.h"
  5. #include "../Core/Object.h"
  6. #include "../GraphicsAPI/GraphicsDefs.h"
  7. namespace Urho3D
  8. {
  9. class IndexBuffer;
  10. class Ray;
  11. class Graphics;
  12. class VertexBuffer;
  13. /// Defines one or more vertex buffers, an index buffer and a draw range.
  14. class URHO3D_API Geometry : public Object
  15. {
  16. URHO3D_OBJECT(Geometry, Object);
  17. public:
  18. /// Construct with one empty vertex buffer.
  19. explicit Geometry(Context* context);
  20. /// Destruct.
  21. ~Geometry() override;
  22. /// Set number of vertex buffers.
  23. /// @property
  24. bool SetNumVertexBuffers(i32 num);
  25. /// Set a vertex buffer by index.
  26. bool SetVertexBuffer(i32 index, VertexBuffer* buffer);
  27. /// Set the index buffer.
  28. /// @property
  29. void SetIndexBuffer(IndexBuffer* buffer);
  30. /// Set the draw range.
  31. bool SetDrawRange(PrimitiveType type, i32 indexStart, i32 indexCount, bool getUsedVertexRange = true);
  32. /// Set the draw range.
  33. bool SetDrawRange(PrimitiveType type, i32 indexStart, i32 indexCount, i32 vertexStart, i32 vertexCount,
  34. bool checkIllegal = true);
  35. /// Set the LOD distance.
  36. /// @property
  37. void SetLodDistance(float distance);
  38. /// Override raw vertex data to be returned for CPU-side operations.
  39. void SetRawVertexData(const SharedArrayPtr<byte>& data, const Vector<VertexElement>& elements);
  40. /// Override raw vertex data to be returned for CPU-side operations using a legacy vertex bitmask.
  41. void SetRawVertexData(const SharedArrayPtr<byte>& data, VertexElements elementMask);
  42. /// Override raw index data to be returned for CPU-side operations.
  43. void SetRawIndexData(const SharedArrayPtr<byte>& data, i32 indexSize);
  44. /// Draw.
  45. void Draw(Graphics* graphics);
  46. /// Return all vertex buffers.
  47. const Vector<SharedPtr<VertexBuffer>>& GetVertexBuffers() const { return vertexBuffers_; }
  48. /// Return number of vertex buffers.
  49. /// @property
  50. i32 GetNumVertexBuffers() const { return vertexBuffers_.Size(); }
  51. /// Return vertex buffer by index.
  52. /// @property{get_vertexBuffers}
  53. VertexBuffer* GetVertexBuffer(i32 index) const;
  54. /// Return the index buffer.
  55. /// @property
  56. IndexBuffer* GetIndexBuffer() const { return indexBuffer_; }
  57. /// Return primitive type.
  58. /// @property
  59. PrimitiveType GetPrimitiveType() const { return primitiveType_; }
  60. /// Return start index.
  61. /// @property
  62. i32 GetIndexStart() const { return indexStart_; }
  63. /// Return number of indices.
  64. /// @property
  65. i32 GetIndexCount() const { return indexCount_; }
  66. /// Return first used vertex.
  67. /// @property
  68. i32 GetVertexStart() const { return vertexStart_; }
  69. /// Return number of used vertices.
  70. /// @property
  71. i32 GetVertexCount() const { return vertexCount_; }
  72. /// Return LOD distance.
  73. /// @property
  74. float GetLodDistance() const { return lodDistance_; }
  75. /// Return buffers' combined hash value for state sorting.
  76. u16 GetBufferHash() const;
  77. /// Return raw vertex and index data for CPU operations, or null pointers if not available. Will return data of the first vertex buffer if override data not set.
  78. void GetRawData(const byte*& vertexData, i32& vertexSize, const byte*& indexData, i32& indexSize, const Vector<VertexElement>*& elements) const;
  79. /// Return raw vertex and index data for CPU operations, or null pointers if not available. Will return data of the first vertex buffer if override data not set.
  80. void GetRawDataShared(SharedArrayPtr<byte>& vertexData, i32& vertexSize, SharedArrayPtr<byte>& indexData,
  81. i32& indexSize, const Vector<VertexElement>*& elements) const;
  82. /// Return ray hit distance or infinity if no hit. Requires raw data to be set. Optionally return hit normal and hit uv coordinates at intersect point.
  83. float GetHitDistance(const Ray& ray, Vector3* outNormal = nullptr, Vector2* outUV = nullptr) const;
  84. /// Return whether or not the ray is inside geometry.
  85. bool IsInside(const Ray& ray) const;
  86. /// Return whether has empty draw range.
  87. /// @property
  88. bool IsEmpty() const { return indexCount_ == 0 && vertexCount_ == 0; }
  89. private:
  90. /// Vertex buffers.
  91. Vector<SharedPtr<VertexBuffer>> vertexBuffers_;
  92. /// Index buffer.
  93. SharedPtr<IndexBuffer> indexBuffer_;
  94. /// Primitive type.
  95. PrimitiveType primitiveType_;
  96. /// Start index.
  97. i32 indexStart_;
  98. /// Number of indices.
  99. i32 indexCount_;
  100. /// First used vertex.
  101. i32 vertexStart_;
  102. /// Number of used vertices.
  103. i32 vertexCount_;
  104. /// LOD distance.
  105. float lodDistance_;
  106. /// Raw vertex data elements.
  107. Vector<VertexElement> rawElements_;
  108. /// Raw vertex data override.
  109. SharedArrayPtr<byte> rawVertexData_;
  110. /// Raw index data override.
  111. SharedArrayPtr<byte> rawIndexData_;
  112. /// Raw vertex data override size.
  113. i32 rawVertexSize_;
  114. /// Raw index data override size.
  115. i32 rawIndexSize_;
  116. };
  117. }