void MapObject_GemCave::_onHole3Changed(vn::EditValue *value) { bool hole = static_cast<vn::EditValueBool *>(value)->getValue(); static_cast<MapObjectDesc_GemCave *>(m_desc.ptr())->setHoleEnabled(3, hole); _updateCaveParts(); _updateCollision(14, !hole); }
void ConvexShape::onScaleChanged() { if ( isProperlyAdded() ) _updateCollision(); }
void ConvexShape::_updateGeometry( bool updateCollision ) { mPlanes.clear(); for ( S32 i = 0; i < mSurfaces.size(); i++ ) mPlanes.push_back( PlaneF( mSurfaces[i].getPosition(), mSurfaces[i].getUpVector() ) ); Vector< Point3F > tangents; for ( S32 i = 0; i < mSurfaces.size(); i++ ) tangents.push_back( mSurfaces[i].getRightVector() ); mGeometry.generate( mPlanes, tangents ); AssertFatal( mGeometry.faces.size() <= mSurfaces.size(), "Got more faces than planes?" ); const Vector< ConvexShape::Face > &faceList = mGeometry.faces; const Vector< Point3F > &pointList = mGeometry.points; // Reset our surface center points. for ( S32 i = 0; i < faceList.size(); i++ ) mSurfaces[ faceList[i].id ].setPosition( faceList[i].centroid ); mPlanes.clear(); for ( S32 i = 0; i < mSurfaces.size(); i++ ) mPlanes.push_back( PlaneF( mSurfaces[i].getPosition(), mSurfaces[i].getUpVector() ) ); // Update bounding box. updateBounds( false ); mVertexBuffer = NULL; mPrimitiveBuffer = NULL; mVertCount = 0; mPrimCount = 0; if ( updateCollision ) _updateCollision(); // Server does not need to generate vertex/prim buffers. if ( isServerObject() ) return; if ( faceList.empty() ) return; // Get total vert and prim count. for ( S32 i = 0; i < faceList.size(); i++ ) { U32 count = faceList[i].triangles.size(); mPrimCount += count; mVertCount += count * 3; } // Allocate VB and copy in data. mVertexBuffer.set( GFX, mVertCount, GFXBufferTypeStatic ); VertexType *pVert = mVertexBuffer.lock(); for ( S32 i = 0; i < faceList.size(); i++ ) { const ConvexShape::Face &face = faceList[i]; const Vector< U32 > &facePntMap = face.points; const Vector< ConvexShape::Triangle > &triangles = face.triangles; const ColorI &faceColor = sgConvexFaceColors[ i % sgConvexFaceColorCount ]; const Point3F binormal = mCross( face.normal, face.tangent ); for ( S32 j = 0; j < triangles.size(); j++ ) { for ( S32 k = 0; k < 3; k++ ) { pVert->normal = face.normal; pVert->tangent = face.tangent; pVert->color = faceColor; pVert->point = pointList[ facePntMap[ triangles[j][k] ] ]; pVert->texCoord = face.texcoords[ triangles[j][k] ]; pVert++; } } } mVertexBuffer.unlock(); // Allocate PB mPrimitiveBuffer.set( GFX, mPrimCount * 3, mPrimCount, GFXBufferTypeStatic ); U16 *pIndex; mPrimitiveBuffer.lock( &pIndex ); for ( U16 i = 0; i < mPrimCount * 3; i++ ) { *pIndex = i; pIndex++; } mPrimitiveBuffer.unlock(); }
/* @brief 移動方向設定 */ void MyShipInterface::moveDirection( const CCPoint& in_rDir ) { CCPoint vec = in_rDir * moveSpeed_; _updateCollision( vec ); }