private void Awake() { _library = Flex.Init(); Flex.SolverDesc _solverDesc = new Flex.SolverDesc(); Flex.SetSolverDescDefaults(ref _solverDesc); _solver = Flex.CreateSolver(_library, ref _solverDesc); _particleBuffer = Flex.AllocBuffer(_library, 28, sizeof(float) * 4, Flex.BufferType.Host); _velocityBuffer = Flex.AllocBuffer(_library, 28, sizeof(float) * 4, Flex.BufferType.Host); _phaseBuffer = Flex.AllocBuffer(_library, 28, sizeof(int), Flex.BufferType.Host); _activeBuffer = Flex.AllocBuffer(_library, 28, sizeof(int), Flex.BufferType.Host); unsafe { int *activeIndices = (int *)Flex.Map(_activeBuffer); for (int i = 0; i < 28; ++i) { activeIndices[i] = i; } Flex.Unmap(_activeBuffer); Flex.SetActive(_solver, _activeBuffer); Flex.SetActiveCount(_solver, 28); } }
static Flex.Buffer CreateBuffer(Flex.Library lib, int elementCount, int elementSize, float[] data) { Flex.Buffer buffer = Flex.AllocBuffer(lib, elementCount, sizeof(float) * elementSize, Flex.BufferType.Host); if (data.Length > 0) { IntPtr ptr = Flex.Map(buffer, Flex.MapFlags.Wait); Marshal.Copy(data, 0, ptr, data.Length); Flex.Unmap(buffer); } return(buffer); }
public void TestAllocFreeBuffer() { Flex.Library lib = Flex.Init(Flex.FLEX_VERSION, ErrorCallback); Flex.Buffer buffer0 = Flex.AllocBuffer(lib, 1000, 4, Flex.BufferType.Host); Flex.Buffer buffer1 = Flex.AllocBuffer(lib, 1000, 4, Flex.BufferType.Device); Flex.FreeBuffer(buffer0); Flex.FreeBuffer(buffer1); Flex.Shutdown(lib); }
public void Create() { m_scene = GetComponentInParent <FlexScene>(); if (m_scene == null) { Debug.LogError("_auxFlexDrawFluid should be parented to a FlexScene"); Debug.Break(); } if (m_scene && m_scene.container && m_scene.container.handle) { m_mesh = new Mesh(); m_mesh.name = "Flex Fluid"; m_mesh.vertices = new Vector3[1]; m_mesh.SetIndices(new int[0], MeshTopology.Points, 0); m_prepareFluidMaterial = new Material(Shader.Find(PREPARE_FLUID_SHADER)); m_prepareFluidMaterial.hideFlags = HideFlags.HideAndDontSave; m_fluidMaterial = m_scene.container.m_fluidMaterial; if (FluidManager.Instance) { FluidManager.Instance.fluids[int.Parse(m_fluidMaterial.name)] = this; //mine } MeshFilter meshFilter = GetComponent <MeshFilter>(); meshFilter.mesh = m_mesh; MeshRenderer meshRenderer = GetComponent <MeshRenderer>(); meshRenderer.material = m_fluidMaterial; meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; meshRenderer.receiveShadows = true; #if UNITY_EDITOR UnityEditor.EditorUtility.SetSelectedRenderState(meshRenderer, UnityEditor.EditorSelectedRenderState.Hidden); #endif int maxParticles = m_scene.container.maxParticles; int size = sizeof(float) * 4; //mine (good?) m_positionBuffer = new ComputeBuffer(maxParticles, size); m_anisotropy1Buffer = new ComputeBuffer(maxParticles, size); m_anisotropy2Buffer = new ComputeBuffer(maxParticles, size); m_anisotropy3Buffer = new ComputeBuffer(maxParticles, size); m_positionBuffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, size, Flex.BufferType.Host); m_anisotropy1Buffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, size, Flex.BufferType.Host); m_anisotropy2Buffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, size, Flex.BufferType.Host); m_anisotropy3Buffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, size, Flex.BufferType.Host); m_temporaryBuffer = new Vector4[maxParticles]; } }
static Flex.Buffer CreateBuffer <Type>(Flex.Library lib, Type[] data) { int elementCount = data.Length; int elementSize = Marshal.SizeOf(data[0]); Flex.Buffer buffer = Flex.AllocBuffer(lib, elementCount, elementSize, Flex.BufferType.Host); if (data.Length > 0) { IntPtr ptr = Flex.Map(buffer, Flex.MapFlags.Wait); for (int i = 0; i < elementCount; ++i) { Marshal.StructureToPtr(data[i], new IntPtr(ptr.ToInt64() + i * elementSize), false); } Flex.Unmap(buffer); } return(buffer); }
public void TestMapUnmapBuffer() { Flex.Library lib = Flex.Init(Flex.FLEX_VERSION, ErrorCallback); Flex.Buffer buffer = Flex.AllocBuffer(lib, 1000, sizeof(float) * 4, Flex.BufferType.Host); float[] positions = new float[1000 * 4]; for (int i = 0; i < positions.Length; i += 4) { positions[i + 0] = 0.1f * i; positions[i + 1] = positions[i + 3] = 0.0f; positions[i + 3] = 0.1f; } IntPtr ptr = Flex.Map(buffer, 0); Marshal.Copy(positions, 0, ptr, positions.Length); Flex.Unmap(buffer); Flex.FreeBuffer(buffer); Flex.Shutdown(lib); }
public ShapeData(Collider collider) { bool dynamic = false; if (collider is SphereCollider) { SphereCollider sphereCollider = collider as SphereCollider; Vector3 scale = collider.transform.localScale; geometry.sphere.radius = sphereCollider.radius * Mathf.Max(scale.x, scale.y, scale.z); flags = Flex.MakeShapeFlags(Flex.CollisionShapeType.Sphere, dynamic); shapeMin = Vector3.one * -geometry.sphere.radius; shapeMax = Vector3.one * geometry.sphere.radius; shapeCenter = sphereCollider.center; shapeCenter.x *= scale.x; shapeCenter.y *= scale.y; shapeCenter.z *= scale.z; } else if (collider is CapsuleCollider) { CapsuleCollider capsuleCollider = collider as CapsuleCollider; Vector3 scale = collider.transform.localScale; if (capsuleCollider.direction == 1) { scale = new Vector3(scale.y, scale.z, scale.x); } if (capsuleCollider.direction == 2) { scale = new Vector3(scale.z, scale.x, scale.y); } geometry.capsule.radius = capsuleCollider.radius * Mathf.Max(scale.y, scale.z); geometry.capsule.halfHeight = capsuleCollider.height * scale.x * 0.5f - geometry.capsule.radius; flags = Flex.MakeShapeFlags(Flex.CollisionShapeType.Capsule, dynamic); shapeMin = new Vector3(-geometry.capsule.halfHeight - geometry.capsule.radius, -geometry.capsule.radius, -geometry.capsule.radius); shapeMax = new Vector3(geometry.capsule.halfHeight + geometry.capsule.radius, geometry.capsule.radius, geometry.capsule.radius); shapeCenter = capsuleCollider.center; shapeCenter.x *= scale.x; shapeCenter.y *= scale.y; shapeCenter.z *= scale.z; if (capsuleCollider.direction == 1) { shapePreRotation = Quaternion.Euler(0.0f, 0.0f, 90.0f); } if (capsuleCollider.direction == 2) { shapePreRotation = Quaternion.Euler(0.0f, 90.0f, 0.0f); } } else if (collider is BoxCollider) { BoxCollider boxCollider = collider as BoxCollider; Vector3 scale = collider.transform.localScale; Vector3 halfSize = new Vector3(boxCollider.size.x * scale.x * 0.5f, boxCollider.size.y * scale.y * 0.5f, boxCollider.size.z * scale.z * 0.5f); geometry.box.halfExtents = halfSize; flags = Flex.MakeShapeFlags(Flex.CollisionShapeType.Box, dynamic); shapeMin = -halfSize; shapeMax = halfSize; shapeCenter = boxCollider.center; shapeCenter.x *= scale.x; shapeCenter.y *= scale.y; shapeCenter.z *= scale.z; } else if (collider is MeshCollider) { MeshCollider meshCollider = collider as MeshCollider; Mesh mesh = meshCollider.sharedMesh; if (mesh) { Vector3 scale = collider.transform.localScale; Vector3 boundsMin = new Vector3(mesh.bounds.min.x * scale.x, mesh.bounds.min.y * scale.y, mesh.bounds.min.z * scale.z); Vector3 boundsMax = new Vector3(mesh.bounds.max.x * scale.x, mesh.bounds.max.y * scale.y, mesh.bounds.max.z * scale.z); Vector3[] vertices = mesh.vertices; int[] triangles = mesh.triangles; if (vertices.Length > 0 && triangles.Length > 0) { bool useConvex = meshCollider.convex; if (useConvex) { Vector4[] planes = new Vector4[triangles.Length / 3]; Vector3[] bounds = new Vector3[2]; int planeCount = FlexUtils.ConvexPlanes(ref vertices[0], ref scale, ref triangles[0], triangles.Length / 3, ref planes[0], ref bounds[0]); // Convex meshes in Flex can't have more than 64 faces if (planeCount <= 64) { m_flexConvex = Flex.CreateConvexMesh(FlexContainer.library); Flex.Buffer planeBuffer = Flex.AllocBuffer(FlexContainer.library, planeCount, sizeof(float) * 4, Flex.BufferType.Host); FlexUtils.FastCopy(planes, Flex.Map(planeBuffer)); Flex.Unmap(planeBuffer); Flex.UpdateConvexMesh(FlexContainer.library, m_flexConvex, planeBuffer, planeCount, ref bounds[0], ref bounds[1]); geometry.convexMesh.scale = Vector3.one; geometry.convexMesh.mesh = m_flexConvex; Flex.FreeBuffer(planeBuffer); flags = Flex.MakeShapeFlags(Flex.CollisionShapeType.ConvexMesh, dynamic); shapeMin = bounds[0]; shapeMax = bounds[1]; } else { useConvex = false; } } if (!useConvex) { int[] uniqueInds = new int[vertices.Length]; int[] originalToUniqueMap = new int[vertices.Length]; int uniqueVertCount = FlexExt.CreateWeldedMeshIndices(ref vertices[0], vertices.Length, ref uniqueInds[0], ref originalToUniqueMap[0], 0.0001f); // @@@ Vector4[] uniqueVerts = new Vector4[uniqueVertCount]; for (int i = 0; i < uniqueVertCount; ++i) { uniqueVerts[i] = new Vector3(vertices[uniqueInds[i]].x * scale.x, vertices[uniqueInds[i]].y * scale.y, vertices[uniqueInds[i]].z * scale.z); } Flex.Buffer vertexBuffer = Flex.AllocBuffer(FlexContainer.library, uniqueVerts.Length, sizeof(float) * 4, Flex.BufferType.Host); FlexUtils.FastCopy(uniqueVerts, Flex.Map(vertexBuffer)); Flex.Unmap(vertexBuffer); int[] indices = new int[triangles.Length]; for (int i = 0; i < triangles.Length; ++i) { indices[i] = originalToUniqueMap[triangles[i]]; } Flex.Buffer indexBuffer = Flex.AllocBuffer(FlexContainer.library, indices.Length, sizeof(int), Flex.BufferType.Host); FlexUtils.FastCopy(indices, Flex.Map(indexBuffer)); Flex.Unmap(indexBuffer); m_flexMesh = Flex.CreateTriangleMesh(FlexContainer.library); Flex.UpdateTriangleMesh(FlexContainer.library, m_flexMesh, vertexBuffer, indexBuffer, uniqueVertCount, indices.Length / 3, ref boundsMin, ref boundsMax); geometry.triMesh.scale = Vector3.one; geometry.triMesh.mesh = m_flexMesh; Flex.FreeBuffer(vertexBuffer); Flex.FreeBuffer(indexBuffer); flags = Flex.MakeShapeFlags(Flex.CollisionShapeType.TriangleMesh, dynamic); Flex.GetTriangleMeshBounds(FlexContainer.library, m_flexMesh, ref shapeMin, ref shapeMax); } } } } shapePrevPosition = collider.transform.position + collider.transform.rotation * shapeCenter; shapePrevRotation = collider.transform.rotation * shapePreRotation; }
void Create() { m_scene = GetComponentInParent <FlexScene>(); if (m_scene == null) { Debug.LogError("_auxFlexDrawFluid should be parented to a FlexScene"); Debug.Break(); } if (m_scene && m_scene.container && m_scene.container.handle) { m_mesh = new Mesh(); m_mesh.name = "Flex Fluid"; m_mesh.vertices = new Vector3[1]; m_mesh.SetIndices(new int[0], MeshTopology.Points, 0); m_prepareFluidMaterial = new Material(Shader.Find(PREPARE_FLUID_SHADER)); m_prepareFluidMaterial.hideFlags = HideFlags.HideAndDontSave; m_fluidMaterial = m_scene.container.fluidMaterial; MeshFilter meshFilter = GetComponent <MeshFilter>(); meshFilter.mesh = m_mesh; MeshRenderer meshRenderer = GetComponent <MeshRenderer>(); meshRenderer.material = m_fluidMaterial; meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; meshRenderer.receiveShadows = true; #if UNITY_EDITOR UnityEditor.EditorUtility.SetSelectedRenderState(meshRenderer, UnityEditor.EditorSelectedRenderState.Hidden); #endif int maxParticles = m_scene.container.maxParticles; m_positionBuffer = new ComputeBuffer(maxParticles, sizeof(float) * 4); m_anisotropy1Buffer = new ComputeBuffer(maxParticles, sizeof(float) * 4); m_anisotropy2Buffer = new ComputeBuffer(maxParticles, sizeof(float) * 4); m_anisotropy3Buffer = new ComputeBuffer(maxParticles, sizeof(float) * 4); m_positionBuffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, sizeof(float) * 4, Flex.BufferType.Host); m_anisotropy1Buffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, sizeof(float) * 4, Flex.BufferType.Host); m_anisotropy2Buffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, sizeof(float) * 4, Flex.BufferType.Host); m_anisotropy3Buffer0 = Flex.AllocBuffer(FlexContainer.library, maxParticles, sizeof(float) * 4, Flex.BufferType.Host); m_temporaryBuffer = new Vector4[maxParticles]; /* * Flex.Params diffuseParams = new Flex.Params * { * diffuseBuoyancy = 1f, * diffuseDrag = 1f, * diffuseLifetime = 1f, * diffuseThreshold = 5f, * }; * * Flex.SetParams(m_scene.container.solver, ref diffuseParams); */ Flex.Buffer diffuseBuffer1 = Flex.AllocBuffer(FlexContainer.library, maxParticles, sizeof(float) * 4, Flex.BufferType.Host); Flex.Buffer diffuseBuffer2 = Flex.AllocBuffer(FlexContainer.library, maxParticles, sizeof(float) * 4, Flex.BufferType.Host); //Flex.SetDiffuseParticles(m_scene.container.solver, diffuseBuffer1, diffuseBuffer2, 0); } }
static Flex.Buffer CreateBuffer(Flex.Library lib, int elementCount, int elementSize) { return(Flex.AllocBuffer(lib, elementCount, sizeof(int) * elementSize, Flex.BufferType.Host)); }
public FlexBuffer(Flex.Library _library, int _count, int _stride, Flex.BufferType _type = Flex.BufferType.Host) { m_handle = Flex.AllocBuffer(_library, _count, _stride, _type); m_count = _count; m_stride = _stride; }