void vsVector3D::Floor() { x = (float)vsFloor(x); y = (float)vsFloor(y); z = (float)vsFloor(z); }
float vsPerlinOctave::InterpolatedNoise2D(float x, float y, int wrap) { int integer_X = vsFloor(x); float fractional_X = x - integer_X; int integer_Y = vsFloor(y); float fractional_Y = y - integer_Y; vsAssert( fractional_X >= 0.f && fractional_X < 1.f, "Maths error: fractional_X out of bounds!" ); vsAssert( fractional_Y >= 0.f && fractional_Y < 1.f, "Maths error: fractional_Y out of bounds!" ); fractional_X = (3.0f * fractional_X * fractional_X) - (2.0f * fractional_X * fractional_X * fractional_X); fractional_Y = (3.0f * fractional_Y * fractional_Y) - (2.0f * fractional_Y * fractional_Y * fractional_Y); float v1 = Noise2D(integer_X, integer_Y, wrap); float v2 = Noise2D(integer_X + 1, integer_Y, wrap); float v3 = Noise2D(integer_X, integer_Y + 1, wrap); float v4 = Noise2D(integer_X + 1, integer_Y + 1, wrap); float i1 = vsInterpolate(fractional_X, v1 , v2); float i2 = vsInterpolate(fractional_X, v3 , v4); return vsInterpolate(fractional_Y, i1 , i2); }
// To force linking in all needed Intel routines // See compileCX for details (linking against .a) void Dummy(void) { vsAdd(); vsSub(); vsDiv(); vsSqr(); vsMul(); vsAbs(); vsInv(); vsSin(); vsCos(); vsSinCos(); vsTan(); vsAsin(); vsAcos(); vsAtan(); vsAtan2(); vsSinh(); vsCosh(); vsTanh(); vsAsinh(); vsAcosh(); vsAtanh(); vsPow(); vsPowx(); vsSqrt(); vsCbrt(); vsInvSqrt(); vsInvCbrt(); vsHypot(); vsFloor(); vsCeil(); vsRound(); vsTrunc(); vsRint(); vsNearbyInt(); vsModf(); vsExp(); vsLn(); vsLog10(); vsErf(); vsErfc(); vsErfInv(); }
int vsMeshMaker::BakeTriangleVertex( vsMeshMakerTriangleVertex &vertex, const vsVector3D &faceNormal ) { if ( m_attemptMerge ) { float bestPriority = -1.f; vsMeshMakerTriangleVertex *best = NULL; vsVector2D deltaTexel; const float testDistance = 1.1f; vsArray<vsMeshMakerTriangleVertex*> array; m_octree->FindPointsWithin( &array, vertex.GetPosition(), testDistance ); for (int i = 0; i < array.ItemCount(); i++) { //vsMeshMakerTriangleVertex *other = &m_vertex[i]; vsMeshMakerTriangleVertex *other = array[i]; if ( m_buildingNormals ) { const float epsilon = 0.01f; const float sqEpsilon = epsilon*epsilon; const bool closeEnough = (other->GetPosition() - vertex.GetPosition()).SqLength() < sqEpsilon; // bool texelMatches = ((other.m_texel - m_texel).SqLength() < sqEpsilon); deltaTexel = other->GetTexel() - vertex.GetTexel(); if ( deltaTexel.x > 1.f ) { deltaTexel.x -= vsFloor(deltaTexel.x); } if ( deltaTexel.y > 1.f ) { deltaTexel.y -= vsFloor(deltaTexel.y); } // const bool texelMatches = deltaTexel.SqLength() < sqEpsilon; bool texelMatches = true; if ( closeEnough && texelMatches ) { float priority = other->GetMergePriorityWith(vertex, faceNormal); if ( priority > bestPriority ) { bestPriority = priority; best = other; } } } else { if ( *other == vertex ) { return i; } } } if ( best && bestPriority >= 0.f ) { vsMeshMakerTriangleVertex newVertex = vertex; bool didMerge = best->AttemptMergeWith(&newVertex, faceNormal); if ( didMerge ) { return best->m_index; } else { // did a fake merge. newVertex.m_index = m_vertexCount; m_vertex[m_vertexCount] = newVertex; //cell->m_vertexIndex.push_back(m_vertexCount); m_octree->AddPoint( &m_vertex[m_vertexCount] ); m_vertexCount++; return m_vertexCount-1; } } } vertex.m_index = m_vertexCount; m_vertex[m_vertexCount] = vertex; m_octree->AddPoint( &m_vertex[m_vertexCount] ); //cell->m_vertexIndex.push_back(m_vertexCount); if ( m_buildingNormals ) { m_vertex[m_vertexCount].SetNormal( faceNormal ); } m_vertexCount++; return m_vertexCount-1; }