PolyScreenShape.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*
  2. * PolyScreenShape.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 5/6/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyScreenShape.h"
  10. using namespace Polycode;
  11. ScreenShape::ScreenShape(int shapeType, Number option1, Number option2, Number option3, Number option4) : ScreenMesh(Mesh::QUAD_MESH) {
  12. Number DEG2RAD = 3.14159/180;
  13. strokeWidth = 1.0f;
  14. this->shapeType = shapeType;
  15. width = option1;
  16. height = option2;
  17. hitwidth = width;
  18. hitheight = height;
  19. this->option1 = option1;
  20. this->option2 = option2;
  21. this->option3 = option3;
  22. this->option4 = option4;
  23. lineSmooth = false;
  24. switch(shapeType) {
  25. case SHAPE_RECT: {
  26. mesh->setMeshType(Mesh::QUAD_MESH);
  27. Polygon *poly = new Polygon();
  28. poly->addVertex(-width/2.0f,-height/2.0f,0,0,1);
  29. poly->addVertex(width/2.0f,-height/2.0f,0, 1, 1);
  30. poly->addVertex(width/2.0f,height/2.0f,0, 1, 0);
  31. poly->addVertex(-width/2.0f,height/2.0f,0,0,0);
  32. mesh->addPolygon(poly);
  33. }
  34. break;
  35. case SHAPE_CIRCLE_OUTLINE:
  36. case SHAPE_CIRCLE: {
  37. mesh->setMeshType(Mesh::TRIFAN_MESH);
  38. Polygon *poly = new Polygon();
  39. int step;
  40. if(option3 > 0)
  41. step = ceil(360/option3);
  42. else
  43. step = 1;
  44. if(shapeType == SHAPE_CIRCLE)
  45. poly->addVertex(0,0,0,0.5,0.5);
  46. else
  47. poly->addVertex(cosf(0)*(width/2),sinf(0)*(height/2), 0, (cosf(0)*0.5) + 0.5,(sinf(0) * 0.5)+ 0.5);
  48. for (int i=0; i < 361; i+= step) {
  49. Number degInRad = i*DEG2RAD;
  50. poly->addVertex(cos(degInRad)*(width/2),sin(degInRad)*(height/2), 0, (cos(degInRad) * 0.5)+ 0.5 ,(sin(degInRad) * 0.5)+ 0.5);
  51. }
  52. mesh->addPolygon(poly);
  53. }
  54. break;
  55. case SHAPE_CUSTOM:
  56. mesh->setMeshType(Mesh::TRIFAN_MESH);
  57. customShapePoly = new Polygon();
  58. mesh->addPolygon(customShapePoly);
  59. break;
  60. default:
  61. break;
  62. }
  63. positionMode = POSITION_CENTER;
  64. strokeEnabled = false;
  65. }
  66. void ScreenShape::setShapeSize(Number newWidth, Number newHeight) {
  67. width = newWidth;
  68. height = newHeight;
  69. hitwidth = width;
  70. hitheight = height;
  71. Number whalf = floor(width/2.0f);
  72. Number hhalf = floor(height/2.0f);
  73. Polygon *polygon;
  74. Vertex *vertex;
  75. switch(shapeType) {
  76. case SHAPE_RECT: {
  77. polygon = mesh->getPolygon(0);
  78. vertex = polygon->getVertex(0);
  79. vertex->set(-whalf,-hhalf,0);
  80. vertex = polygon->getVertex(1);
  81. vertex->set(-whalf+width,-hhalf,0);
  82. vertex = polygon->getVertex(2);
  83. vertex->set(-whalf+width,-hhalf+height,0);
  84. vertex = polygon->getVertex(3);
  85. vertex->set(-whalf,-hhalf+height,0);
  86. }
  87. break;
  88. default:
  89. break;
  90. }
  91. mesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  92. rebuildTransformMatrix();
  93. matrixDirty = true;
  94. }
  95. void ScreenShape::addShapePoint(Number x, Number y) {
  96. customShapePoly->addVertex(x,y,0,0,0);
  97. }
  98. void ScreenShape::setGradient(Number r1, Number g1, Number b1, Number a1, Number r2, Number g2, Number b2, Number a2) {
  99. for(int i=0; i < mesh->getPolygon(0)->getVertexCount(); i++) {
  100. mesh->getPolygon(0)->getVertex(i)->useVertexColor = true;
  101. }
  102. switch(shapeType) {
  103. case SHAPE_RECT:
  104. mesh->getPolygon(0)->getVertex(0)->vertexColor.setColor(r1,g1,b1,a1);
  105. mesh->getPolygon(0)->getVertex(1)->vertexColor.setColor(r1,g1,b1,a1);
  106. mesh->getPolygon(0)->getVertex(2)->vertexColor.setColor(r2,g2,b2,a2);
  107. mesh->getPolygon(0)->getVertex(3)->vertexColor.setColor(r2,g2,b2,a2);
  108. break;
  109. case SHAPE_CIRCLE:
  110. case SHAPE_CIRCLE_OUTLINE:
  111. mesh->getPolygon(0)->getVertex(0)->vertexColor.setColor(r1,g1,b1,a1);
  112. for(int i=1; i < mesh->getPolygon(0)->getVertexCount(); i++) {
  113. mesh->getPolygon(0)->getVertex(i)->vertexColor.setColor(r2,g2,b2,a2);
  114. }
  115. break;
  116. }
  117. }
  118. void ScreenShape::clearGradient() {
  119. for(int i=0; i < mesh->getPolygon(0)->getVertexCount(); i++) {
  120. mesh->getPolygon(0)->getVertex(i)->useVertexColor = false;
  121. }
  122. }
  123. void ScreenShape::setStrokeWidth(Number width) {
  124. strokeWidth = width;
  125. }
  126. void ScreenShape::setStrokeColor(Number r, Number g, Number b, Number a) {
  127. strokeColor.setColor(r,g,b,a);
  128. }
  129. void ScreenShape::Render() {
  130. Renderer *renderer = CoreServices::getInstance()->getRenderer();
  131. ScreenMesh::Render();
  132. if(strokeEnabled) {
  133. if(lineSmooth) {
  134. renderer->setLineSmooth(true);
  135. }
  136. renderer->setLineSize(strokeWidth);
  137. renderer->setVertexColor(strokeColor.r,strokeColor.g,strokeColor.b,strokeColor.a);
  138. int rmode = renderer->getRenderMode();
  139. renderer->setRenderMode(Renderer::RENDER_MODE_WIREFRAME);
  140. renderer->pushDataArrayForMesh(mesh, RenderDataArray::COLOR_DATA_ARRAY);
  141. renderer->pushDataArrayForMesh(mesh, RenderDataArray::VERTEX_DATA_ARRAY);
  142. renderer->pushDataArrayForMesh(mesh, RenderDataArray::TEXCOORD_DATA_ARRAY);
  143. renderer->drawArrays(mesh->getMeshType());
  144. renderer->setRenderMode(rmode);
  145. renderer->setLineSize(1.0f);
  146. renderer->setLineSmooth(false);
  147. }
  148. }
  149. ScreenShape::~ScreenShape() {
  150. }