// 下滤算法 void filter(int *data, unsigned int i, unsigned int n) { int currentNodeValue = data[i]; unsigned int child = leftChildIndex(i); while (child < n) { if (hasSibling(child, n) && data[child + 1] < data[child]) { child++; // 取左右子节点中,更小的值 } if (data[child] < currentNodeValue) { data[i] = data[child]; i = child; child = leftChildIndex(i); } else { break; } } data[i] = currentNodeValue; }
void ElysiumEngine::RigidBody::lateInitialize() { if(hasSibling("Transform")) { transform = getSibling<Transform>("Transform"); } else { assert(0 && "Rigid Body relies on Transform"); } if(m_Gravity) { accumulator.AddForce(new Gravity(Vec4(0.0f,m_GravMag,0.0f),m_Mass)); } switch(m_Type) { case E_SPHERE: { if(!hasSibling("SphereCollider")) return; SphereCollider *Collider = getSibling<SphereCollider>("SphereCollider"); m_IntertiaTensor[0][0] = m_IntertiaTensor[1][1] = m_IntertiaTensor[2][2] = Collider->getRadius() * Collider->getRadius(); m_IntertiaTensor *= (2.0f / 5.0f) * m_Mass; m_IntertiaTensor[3][3] = 1.0f; } break; case E_BOX: { if(!hasSibling("OBBCollider")) return; Vec4 Scale = transform->GetScale(); m_IntertiaTensor[0][0] = Scale.y * Scale.y + Scale.z * Scale.z; m_IntertiaTensor[1][1] = Scale.x * Scale.x + Scale.z * Scale.z; m_IntertiaTensor[2][2] = Scale.x * Scale.x + Scale.y * Scale.y; m_IntertiaTensor *= 1.0f / 12.0f * m_Mass; m_IntertiaTensor[3][3] = 1.0f; break; } case E_MESH: break; } m_InverseTensor = m_IntertiaTensor.Inverse(); if(hasSibling("MeshRenderable")) { MeshRenderable *renderable = getSibling<MeshRenderable>("MeshRenderable"); Mesh *mesh = renderable->getMesh(); Matrix tensor; tensor.Identity(); this->m_IntertiaTensor.Identity(); Vec4 *verts = new Vec4[mesh->vertexCount]; int *indices = new int[mesh->indexCount * 3]; for(int i = 0; i < mesh->vertexCount; ++i) { verts[i] = mesh->vertices[i].position; } for(int i = 0; i < mesh->indexCount * 3; ++i) { indices[i] = mesh->indices[i]; } compute(verts, mesh->indexCount , indices, m_Mass, com, this->m_IntertiaTensor); m_Mass *= density; m_InverseMass = 1.0f / m_Mass; m_IntertiaTensor *= density; m_InverseTensor = m_IntertiaTensor.Inverse(); std::cout << "\nMass: " << m_Mass << std::endl; delete []verts; delete []indices; } }