TriangleSystem::TriangleSystem(ATriangleMesh * md) { const unsigned np = md->numPoints(); create(md->numTriangles(), md->numTriangles(), np); Vector3F * p = md->points(); Vector3F * q = (Vector3F *)hostX(); unsigned i = 0; for(;i<np;i++) q[i] = p[i]; Vector3F * qi = (Vector3F *)hostXi(); for(i=0;i<np;i++) qi[i] = q[i]; Vector3F * vel = (Vector3F *)hostV(); for(i=0;i<np;i++) vel[i].setZero(); unsigned * ind = (unsigned *)md->indices(); unsigned * tris = hostTriangleIndices(); for(i=0; i< md->numIndices(); i++) tris[i] = ind[i]; unsigned * tetra = hostTetrahedronIndices(); for(i=0; i< md->numTriangles(); i++) { tetra[i*4] = ind[i*3]; tetra[i*4+1] = ind[i*3+1]; tetra[i*4+2] = ind[i*3+2]; tetra[i*4+3] = tetra[i*4+2]; } float * mass = hostMass(); for(i=0;i<np;i++) mass[i] = 1e20f; setNumPoints(np); setNumTetrahedrons(md->numTriangles()); setNumTriangles(md->numTriangles()); }
TetrahedronSystem::TetrahedronSystem() { m_hostTetrahedronVicinityInd = new BaseBuffer; m_hostTetrahedronVicinityStart = new BaseBuffer; m_hostElementValue = new BaseBuffer; create(NTET, NTET * 4, NPNT); m_hostElementValue->create(NTET * 4); float * hv = &hostV()[0]; unsigned i, j; float vy = 3.95f; float vrx, vry, vrz, vr, vs; for(j=0; j < GRDH; j++) { for(i=0; i<GRDW; i++) { vs = 1.75f + RandomF01() * 1.5f; Vector3F base(9.3f * i, 9.3f * j, 0.f * j); Vector3F right = base + Vector3F(1.75f, 0.f, 0.f) * vs; Vector3F front = base + Vector3F(0.f, 0.f, 1.75f) * vs; Vector3F top = base + Vector3F(0.f, 1.75f, 0.f) * vs; if((j&1)==0) { right.y = top.y-.1f; } else { base.x -= .085f * vs; } vrx = 0.725f * (RandomF01() - .5f); vry = 1.f * (RandomF01() + 1.f) * vy; vrz = 0.732f * (RandomF01() - .5f); vr = 0.13f * RandomF01(); addPoint(&base.x); hv[0] = vrx + vr; hv[1] = vry; hv[2] = vrz - vr; hv+=3; addPoint(&right.x); hv[0] = vrx - vr; hv[1] = vry; hv[2] = vrz + vr; hv+=3; addPoint(&top.x); hv[0] = vrx + vr; hv[1] = vry; hv[2] = vrz + vr; hv+=3; addPoint(&front.x); hv[0] = vrx - vr; hv[1] = vry; hv[2] = vrz - vr; hv+=3; unsigned b = (j * GRDW + i) * 4; addTetrahedron(b, b+1, b+2, b+3); } vy = -vy; } setTotalMass(100.f); setInitialTotalMass(100.f); calculateMass(); createL2Vicinity(); }