You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.1 KiB

  1. ManualVertices = class("ManualVertices")
  2. function ManualVertices:ctor(vertexFormat)
  3. -- 自动计算的包围盒
  4. self._boundingBox = nil;
  5. -- 顶点缓冲区
  6. self._vertices = {};
  7. -- 顶点格式
  8. self._vertexFormat = vertexFormat;
  9. self._vertexElementOffset = {};
  10. self._vertexElementSize = {};
  11. -- 顶点的float元素个数
  12. self._vertexSize = 0;
  13. for i , v in ipairs(self._vertexFormat) do
  14. self._vertexElementOffset[v.usage] = self._vertexSize + 1;
  15. self._vertexElementSize[v.usage] = self._vertexSize;
  16. self._vertexSize = self._vertexSize + v.size
  17. end
  18. -- 当前颜色
  19. self._color = cc.c4f(1,1,1,1);
  20. end
  21. local function createVertex(num)
  22. local vertex = {};
  23. for i = 1 , num do
  24. table.insert(vertex , 0);
  25. end
  26. return vertex
  27. end
  28. function ManualVertices:setVertexPos(vertex , pos)
  29. local offset = self._vertexElementOffset[cc.VertexFormatUsage.POSITION];
  30. vertex[offset] = pos.x or 0;
  31. vertex[offset + 1] = pos.y or 0;
  32. vertex[offset + 2] = pos.z or 0;
  33. end
  34. function ManualVertices:setVertexColor(vertex , color)
  35. local offset = self._vertexElementOffset[cc.VertexFormatUsage.COLOR];
  36. vertex[offset] = color.r or 0;
  37. vertex[offset + 1] = color.g or 0;
  38. vertex[offset + 2] = color.b or 0;
  39. vertex[offset + 3] = color.a or 0;
  40. end
  41. function ManualVertices:insertVertex(vertex)
  42. local offset = self._vertexElementOffset[cc.VertexFormatUsage.POSITION];
  43. local pos = cc.vec3(vertex[offset] , vertex[offset + 1] , vertex[offset + 2]);
  44. if self._boundingBox == nil then
  45. self._boundingBox = cc.BoundingBox:new(pos , pos);
  46. end
  47. self._boundingBox:merge(pos);
  48. for i , v in ipairs(vertex) do
  49. table.insert(self._vertices , v);
  50. end
  51. end
  52. function ManualVertices:createVertex()
  53. local vertex = createVertex(self._vertexSize);
  54. self:setVertexColor(vertex , self._color);
  55. return vertex;
  56. end
  57. -- 获取顶点数据
  58. function ManualVertices:getVertices()
  59. return self._vertices;
  60. end
  61. -- 获得顶点个数
  62. function ManualVertices:getVertexCount()
  63. return #self._vertices / self._vertexSize;
  64. end
  65. -- 获取包围盒
  66. function ManualVertices:getBoundingBox()
  67. return self._boundingBox;
  68. end
  69. -- 设置当前颜色
  70. function ManualVertices:setColor(color)
  71. self._color = color;
  72. end
  73. -- 画一根线
  74. function ManualVertices:drawLine(startPos , endPos)
  75. local vertex;
  76. vertex = self:createVertex();
  77. self:setVertexPos(vertex , startPos);
  78. self:insertVertex(vertex);
  79. vertex = self:createVertex();
  80. self:setVertexPos(vertex , endPos);
  81. self:insertVertex(vertex);
  82. end
  83. -- 画一个矩形
  84. function ManualVertices:drawRect(leftTop , rightTop , leftBottom , rightBottom)
  85. local vertex;
  86. vertex = self:createVertex();
  87. self:setVertexPos(vertex , leftTop);
  88. self:insertVertex(vertex);
  89. vertex = self:createVertex();
  90. self:setVertexPos(vertex , rightTop);
  91. self:insertVertex(vertex);
  92. vertex = self:createVertex();
  93. self:setVertexPos(vertex , leftBottom);
  94. self:insertVertex(vertex);
  95. vertex = self:createVertex();
  96. self:setVertexPos(vertex , leftBottom);
  97. self:insertVertex(vertex);
  98. vertex = self:createVertex();
  99. self:setVertexPos(vertex , rightTop);
  100. self:insertVertex(vertex);
  101. vertex = self:createVertex();
  102. self:setVertexPos(vertex , rightBottom);
  103. self:insertVertex(vertex);
  104. end