void CreateTool::JitterInstanceOffsets( float instanceRadius, float maxJitter, V_Vector3& offsets ) { V_Vector3 jitterVectors; jitterVectors.push_back( Editor::UpVector ); jitterVectors.push_back( Editor::OutVector ); V_Vector3::iterator itr = offsets.begin(); V_Vector3::iterator end = offsets.end(); for ( ; itr != end; ++itr ) { V_Vector3::const_iterator jitterItr = jitterVectors.begin(); V_Vector3::const_iterator jitterEnd = jitterVectors.end(); for ( ; jitterItr != jitterEnd; ++jitterItr ) { int searchTries = 10; while ( searchTries > 0 ) { --searchTries; float jitter = ( rand() / ( (float) RAND_MAX + 1.0f ) ) * 2.0f - 1.0f; float randomNumber = rand() / ( (float) RAND_MAX + 1.0f ); float testNumber = GetNormalProbabilityFromPercent( jitter ); if ( randomNumber <= testNumber ) { (*itr) += (*jitterItr) * jitter * maxJitter; searchTries = 0; } } } } }
static void MakeContinuous(V_Vector3& cvs) { // ensure continuity through to first and last cvs by creating new begin and end tagent cvs Vector3 ab = cvs[0] - cvs[1]; cvs.insert(cvs.begin(), cvs[0] + ab); Vector3 cd = cvs[ cvs.size() - 1 ] - cvs[ cvs.size() - 2 ]; cvs.push_back(cvs[ cvs.size() - 1 ] + cd); }
static void MakeClosed(V_Vector3& cvs) { // synthisize a new knot from the last two and first two cvs cvs.insert(cvs.begin(), cvs[cvs.size()-1]); cvs.insert(cvs.begin(), cvs[cvs.size()-2]); // this is 2 and 3 since we inserted @ 0 above cvs.push_back(cvs[2]); cvs.push_back(cvs[3]); }
void CreateTool::RandomizeInstanceOffsets( V_Vector3& offsets ) { V_Vector3 newOffsets; newOffsets.reserve( offsets.size() ); while ( offsets.size() ) { V_Vector3::iterator itr = offsets.begin() + ( rand() % offsets.size() ); newOffsets.push_back( *itr ); offsets.erase( itr ); } V_Vector3::iterator itr = newOffsets.begin(); V_Vector3::iterator end = newOffsets.end(); for ( ; itr != end; ++itr ) { offsets.push_back( *itr ); } }
void AlignedBox::Transform(const Matrix4& matrix) { // get the currents sample bounds V_Vector3 vertices; GetVertices( vertices ); // reseed this box Reset(); // iterate and resample the bounds V_Vector3::iterator itr = vertices.begin(); V_Vector3::iterator end = vertices.end(); for ( ; itr != end; ++itr ) { // transform the sample matrix.TransformVertex( *itr ); // test the sample Test( *itr ); } }
void CreateTool::SelectInstanceOffsets( DistributionStyle style, float radius, V_Vector3& offsets ) { V_Vector3 selectedOffsets; selectedOffsets.reserve( offsets.size() ); V_Vector3::iterator itr = offsets.begin(); V_Vector3::iterator end = offsets.end(); for ( ; itr != end; ++itr ) { switch ( style ) { case DistributionStyles::Uniform: { float randomNumber = rand() / ( (float) RAND_MAX + 1.0f ); if ( randomNumber <= 0.5f ) { selectedOffsets.push_back( *itr ); } break; } case DistributionStyles::Linear: { float radiusPercent = (*itr).Length() / radius; float randomNumber = rand() / ( (float) RAND_MAX + 1.0f ); float testNumber = 1.0f - radiusPercent; if ( randomNumber <= testNumber ) { selectedOffsets.push_back( *itr ); } break; } case DistributionStyles::Normal: { float radiusPercent = (*itr).Length() / radius; float randomNumber = rand() / ( (float) RAND_MAX + 1.0f ); float testNumber = GetNormalProbabilityFromPercent( radiusPercent ); if ( randomNumber <= testNumber ) { selectedOffsets.push_back( *itr ); } break; } case DistributionStyles::Constant: default: selectedOffsets.push_back( *itr ); break; } } offsets.clear(); offsets.reserve( selectedOffsets.size() ); itr = selectedOffsets.begin(); end = selectedOffsets.end(); for ( ; itr != end; ++itr ) { offsets.push_back( *itr ); } }