CCustomShape::CCustomShape(void) { SetShapeType(); m_fRadius = 100; setPolygonModeOverrideable(false); m_defaultColor = Ogre::ColourValue(0, 1.0, 0, 0.5); m_pUnreachRegion = NULL; m_Weights = NULL; //m_Dist = NULL; }
Cliff_Small::Cliff_Small(Vector2 startingPosition) { int zoom = ((ShapeGameManager*)theWorld.GetGameManager())->WorldZoom * 2; SetSize(zoom); SetPosition(startingPosition); // SetSprite("Resources/Images/sa_cliff_small.png"); SetDensity(0.0f); SetFriction(0.5f); SetRestitution(0.0f); SetShapeType(PhysicsActor::SHAPETYPE_BOX); SetColor(1.0f, 1.0f, 0.5f, 1.0f); InitPhysics(); Tag("ground"); }
FinishLine::FinishLine(Vector2 startingPosition) { int zoom = ((ShapeGameManager*)theWorld.GetGameManager())->WorldZoom; SetSize(zoom * 1.75, zoom * 2); SetPosition(startingPosition); SetSprite("Resources/Images/sa_finish_line.png"); // SetUVs(Vector2(0.0f, 0.0f), Vector2(7.0f, 5.0f)); SetDensity(0.0f); SetFriction(0.5f); SetRestitution(0.0f); SetShapeType(PhysicsActor::SHAPETYPE_BOX); SetColor(1.0f, 1.0f, 1.0f, 1.0f); // InitPhysics(); Tag("ground"); }
// 填充数据区 void CCustomShape::FillAreaPointData() { size_t posCount = m_planePointArray.size(); if ( posCount <= 0 ) { //ClearVertexBuffer(); return; } // 创建定点缓冲区. CreateAreaVertexBuffer(); // 更新包围盒以便能够显示线段 Ogre::Vector3 vmax(Ogre::Vector3::ZERO); Ogre::Vector3 vmin(Ogre::Vector3::ZERO); for (size_t ii = 0; ii < posCount; ++ii) { if(vmin.x > m_planePointArray[ii].x) { vmin.x = m_planePointArray[ii].x; } if(vmin.y > m_planePointArray[ii].y) { vmin.y = m_planePointArray[ii].y; } if(vmin.z > m_planePointArray[ii].z) { vmin.z = m_planePointArray[ii].z; } if(vmax.x < m_planePointArray[ii].x) { vmax.x = m_planePointArray[ii].x; } if(vmax.y < m_planePointArray[ii].y) { vmax.y = m_planePointArray[ii].y; } if(vmax.z < m_planePointArray[ii].z) { vmax.z = m_planePointArray[ii].z; } } vmin.x -= 100.0f; vmax.x += 100.0f; vmin.y -= 100.0f; vmax.y += 100.0f; vmin.z -= 100.0f; vmax.z += 100.0f; // 求半径 Ogre::Real sqLen = std::max(vmax.squaredLength(), vmin.squaredLength()); m_fRadius = Ogre::Math::Sqrt(sqLen);// // 更新包围盒 mBox.setExtents(vmin,vmax);// getParentNode()->needUpdate();// // 锁定缓冲区, 填充数据. Ogre::RGBA *pCol; Ogre::ColourValue color; bool bSetColor = false; float *vertexPos = static_cast<float*>(m_vbuf->lock(Ogre::HardwareBuffer::HBL_DISCARD)); Ogre::ColourValue Areacolor = Ogre::ColourValue(5.0, 0, 1.0, 0.5); for (size_t i = 0; i < posCount; ++i) { *vertexPos = m_planePointArray[i].x; vertexPos++; *vertexPos = m_planePointArray[i].y+20; vertexPos++; *vertexPos = m_planePointArray[i].z; vertexPos++; pCol = static_cast<Ogre::RGBA*>(static_cast<void*>(vertexPos)); // 用diffuse来做为alpha来源 Ogre::Root::getSingleton().convertColourValue(Areacolor, pCol++ ) ; vertexPos = static_cast<float*>(static_cast<void*>(pCol)); } m_vbuf->unlock(); SetShapeType(Ogre::RenderOperation::OT_TRIANGLE_LIST); }
// 填充点的信息 void CCustomShape::FillPointData() { size_t posCount = m_pointArray.size(); if ( posCount <= 0 ) { return; } // 创建定点缓冲区. CreateVertexBuffer(); // 更新包围盒以便能够显示线段 Ogre::Vector3 vmax(Ogre::Vector3::ZERO); Ogre::Vector3 vmin(Ogre::Vector3::ZERO); for (size_t ii = 0; ii < posCount; ++ii) { if(vmin.x > m_pointArray[ii].x) { vmin.x = m_pointArray[ii].x; } if(vmin.y > m_pointArray[ii].y) { vmin.y = m_pointArray[ii].y; } if(vmin.z > m_pointArray[ii].z) { vmin.z = m_pointArray[ii].z; } if(vmax.x < m_pointArray[ii].x) { vmax.x = m_pointArray[ii].x; } if(vmax.y < m_pointArray[ii].y) { vmax.y = m_pointArray[ii].y; } if(vmax.z < m_pointArray[ii].z) { vmax.z = m_pointArray[ii].z; } } vmin.x -= 100.0f; vmax.x += 100.0f; vmin.y -= 100.0f; vmax.y += 100.0f; vmin.z -= 100.0f; vmax.z += 100.0f; // 求半径 Ogre::Real sqLen = std::max(vmax.squaredLength(), vmin.squaredLength()); m_fRadius = Ogre::Math::Sqrt(sqLen);// // 更新包围盒 mBox.setExtents(vmin,vmax);// getParentNode()->needUpdate();// // 锁定缓冲区, 填充数据. Ogre::RGBA *pCol; Ogre::ColourValue color; bool bSetColor = false; float *vertexPos = static_cast<float*>(m_vbuf->lock(Ogre::HardwareBuffer::HBL_DISCARD)); for (size_t i = 0; i < posCount; ++i) { *vertexPos++ = m_pointArray[i].x; *vertexPos++ = m_pointArray[i].y+10; *vertexPos++ = m_pointArray[i].z; if( !bSetColor) { // 填充定点颜色 color = m_defaultColor; } if(m_LineColroMap.count(i)) { color = m_LineColroMap[i]; bSetColor = true; } else { bSetColor = false; } pCol = static_cast<Ogre::RGBA*>(static_cast<void*>(vertexPos)); // 用diffuse来做为alpha来源 Ogre::Root::getSingleton().convertColourValue(m_defaultColor, pCol++ ) ; vertexPos = static_cast<float*>(static_cast<void*>(pCol)); } m_vbuf->unlock(); SetShapeType(); }