U32 DecalRoad::addNode( const Point3F &pos, F32 width ) { U32 idx = _addNode( pos, width ); _generateEdges(); scheduleUpdate( GenEdgesMask | ReClipMask | NodeMask ); return idx; }
U32 DecalRoad::insertNode(const Point3F &pos, const F32 &width, const U32 &idx) { U32 ret = _insertNode( pos, width, idx ); _generateEdges(); scheduleUpdate( GenEdgesMask | ReClipMask | NodeMask ); return ret; }
void DecalRoad::deleteNode( U32 idx ) { if ( mNodes.size() - 1 < idx ) return; mNodes.erase(idx); _generateEdges(); scheduleUpdate( GenEdgesMask | ReClipMask | NodeMask ); }
void DecalRoad::setNodeWidth( U32 idx, F32 width ) { if ( mNodes.size() - 1 < idx ) return; mNodes[idx].width = width; _generateEdges(); scheduleUpdate( GenEdgesMask | ReClipMask | NodeMask ); }
void DecalRoad::setNodePosition( U32 idx, const Point3F &pos ) { if ( mNodes.size() - 1 < idx ) return; mNodes[idx].point = pos; _generateEdges(); scheduleUpdate( GenEdgesMask | ReClipMask | NodeMask ); }
void DecalRoad::setBreakAngle( F32 degrees ) { //meters = getMax( meters, MIN_METERS_PER_SEGMENT ); //if ( mBreakAngle == meters ) // return; mBreakAngle = degrees; _generateEdges(); scheduleUpdate( DecalRoadMask | GenEdgesMask | ReClipMask ); }
void DecalRoad::setTextureLength( F32 meters ) { meters = getMax( meters, 0.1f ); if ( mTextureLength == meters ) return; mTextureLength = meters; _generateEdges(); scheduleUpdate( DecalRoadMask | ReClipMask ); }
void DecalRoad::buildNodesFromList( DecalRoadNodeList* list ) { mNodes.clear(); for (U32 i=0; i<list->mPositions.size(); ++i) { _addNode( list->mPositions[i], list->mWidths[i] ); } _generateEdges(); _captureVerts(); }
bool DecalRoad::onAdd() { if ( !Parent::onAdd() ) return false; // DecalRoad is at position zero when created, // it sets its own position to the first node inside // _generateEdges but until it has at least one node // it will be at 0,0,0. MatrixF mat(true); Parent::setTransform( mat ); // The client side calculates bounds based on clipped geometry. It would // be wasteful for the server to do this so the server uses global bounds. if ( isServerObject() ) { setGlobalBounds(); resetWorldBox(); } // Set the Render Transform. setRenderTransform(mObjToWorld); // Add to Scene. addToScene(); if ( isServerObject() ) getServerSet()->addObject( this ); // TerrainBlock::smUpdateSignal.notify( this, &DecalRoad::_onTerrainChanged ); // if ( isClientObject() ) _initMaterial(); _generateEdges(); _captureVerts(); return true; }
void DecalRoad::unpackUpdate( NetConnection *con, BitStream *stream ) { // Unpack Parent. Parent::unpackUpdate( con, stream ); // DecalRoadMask if ( stream->readFlag() ) { String matName; stream->read( &matName ); if ( matName != mMaterialName ) { mMaterialName = matName; Material *pMat = NULL; if ( !Sim::findObject( mMaterialName, pMat ) ) { Con::printf( "DecalRoad::unpackUpdate, failed to find Material of name %s!", mMaterialName.c_str() ); } else { mMaterial = pMat; if ( isProperlyAdded() ) _initMaterial(); } } stream->read( &mBreakAngle ); stream->read( &mSegmentsPerBatch ); stream->read( &mTextureLength ); stream->read( &mRenderPriority ); } // NodeMask if ( stream->readFlag() ) { //U32 count = stream->readInt( 16 ); //mNodes.clear(); //Point3F pos; //F32 width; //for ( U32 i = 0; i < count; i++ ) //{ // mathRead( *stream, &pos ); // stream->read( &width ); // _addNode( pos, width ); //} if (stream->readFlag()) { // Nodes have been passed in this update U32 count = stream->readInt( 16 ); mNodes.clear(); Point3F pos; F32 width; for ( U32 i = 0; i < count; i++ ) { mathRead( *stream, &pos ); stream->read( &width ); _addNode( pos, width ); } } else { // Nodes will arrive as events U32 id; stream->read( &id ); // Check if the road's nodes made it here before we did. NodeListManager::NodeList* list = NULL; if ( gClientNodeListManager->findListById( id, &list, true) ) { // Work with the completed list DecalRoadNodeList* roadList = dynamic_cast<DecalRoadNodeList*>( list ); if (roadList) buildNodesFromList( roadList ); delete list; } else { // Nodes have not yet arrived, so register our interest in the list DecalRoadNodeListNotify* notify = new DecalRoadNodeListNotify( this, id ); gClientNodeListManager->registerNotification( notify ); } } } // GenEdgesMask if ( stream->readFlag() && isProperlyAdded() ) _generateEdges(); // ReClipMask if ( stream->readFlag() && isProperlyAdded() ) _captureVerts(); // TerrainChangedMask if ( stream->readFlag() ) { if ( isProperlyAdded() ) { if ( mTerrainUpdateRect.isOverlapped( getWorldBox() ) ) { _generateEdges(); _captureVerts(); // Clear out the mTerrainUpdateRect since we have updated its // region and we now need to store future terrain changes // in it. mTerrainUpdateRect = Box3F::Invalid; } } } }
void DecalRoad::regenerate() { _generateEdges(); _captureVerts(); setMaskBits( NodeMask | GenEdgesMask | ReClipMask ); }
void DecalRoad::unpackUpdate( NetConnection *con, BitStream *stream ) { // Unpack Parent. Parent::unpackUpdate( con, stream ); // NodeMask if ( stream->readFlag() ) { U32 count = stream->readInt( 16 ); mNodes.clear(); Point3F pos; F32 width; for ( U32 i = 0; i < count; i++ ) { mathRead( *stream, &pos ); stream->read( &width ); _addNode( pos, width ); } } // DecalRoadMask if ( stream->readFlag() ) { String matName; stream->read( &matName ); if ( matName != mMaterialName ) { mMaterialName = matName; Material *pMat = NULL; if ( !Sim::findObject( mMaterialName, pMat ) ) { Con::printf( "DecalRoad::unpackUpdate, failed to find Material of name %s!", mMaterialName.c_str() ); } else { mMaterial = pMat; if ( isProperlyAdded() ) _initMaterial(); } } stream->read( &mBreakAngle ); stream->read( &mSegmentsPerBatch ); stream->read( &mTextureLength ); stream->read( &mRenderPriority ); } // GenEdgesMask if ( stream->readFlag() && isProperlyAdded() ) _generateEdges(); // ReClipMask if ( stream->readFlag() && isProperlyAdded() ) _captureVerts(); // TerrainChangedMask if ( stream->readFlag() ) { if ( isProperlyAdded() ) { if ( mTerrainUpdateRect.isOverlapped( getWorldBox() ) ) { _generateEdges(); _captureVerts(); // Clear out the mTerrainUpdateRect since we have updated its // region and we now need to store future terrain changes // in it. mTerrainUpdateRect = Box3F::Invalid; } } } }