void Surfel::transformToWorldSpace(const CFrame& xform) { position = xform.pointToWorldSpace(position); geometricNormal = xform.vectorToWorldSpace(geometricNormal); shadingNormal = xform.vectorToWorldSpace(shadingNormal); shadingTangent1 = xform.vectorToWorldSpace(shadingTangent1); shadingTangent2 = xform.vectorToWorldSpace(shadingTangent2); }
void ParticleSurface::sortAndUploadIndices(shared_ptr<ParticleSurface> particleSurface, const Vector3& csz) { ParticleSystem::s_sortArray.fastClear(); shared_ptr<ParticleSystem::Block> block = particleSurface->m_block; shared_ptr<ParticleSystem> particleSystem = block->particleSystem.lock(); for (int i = 0; i < particleSystem->m_particle.size(); ++i) { const ParticleSystem::Particle& particle = particleSystem->m_particle[i]; CFrame cframe; particleSurface->getCoordinateFrame(cframe); const Point3& wsPosition = particleSystem->particlesAreInWorldSpace() ? particle.position : cframe.pointToWorldSpace(particle.position); const float particleCSZ = dot(wsPosition, csz); ParticleSystem::SortProxy proxy; proxy.index = block->startIndex + i; proxy.z = particleCSZ; ParticleSystem::s_sortArray.append(proxy); } ParticleSystem::s_sortArray.sort(SORT_DECREASING); ParticleSystem::ParticleBuffer& pBuffer = ParticleSystem::s_particleBuffer; bool needsReallocation = true; if (pBuffer.indexStream.valid() && (pBuffer.indexStream.maxSize() >= size_t(ParticleSystem::s_sortArray.size()))) { needsReallocation = false; } if (needsReallocation) { int numToAllocate = ParticleSystem::s_sortArray.size() * 2; shared_ptr<VertexBuffer> vb = VertexBuffer::create(sizeof(int) * numToAllocate + 8); int ignored; pBuffer.indexStream = IndexStream(ignored, numToAllocate, vb); } static Array<int> sortedIndices; sortedIndices.fastClear(); for (const ParticleSystem::SortProxy& p : ParticleSystem::s_sortArray) { sortedIndices.append(p.index); } pBuffer.indexStream.update(sortedIndices); }
Box2D::Box2D(const CFrame& frame, Box2D& b) { for (int i = 0; i < 4; ++i) { m_corner[i] = frame.pointToWorldSpace(Vector3(b.corner(i), 0)).xy(); } computeAxes(); }