public void TestCreateDestroyContainerWithDevice()
    {
        Flex.InitDesc desc = new Flex.InitDesc
        {
            deviceIndex      = -1,
            enableExtensions = false,
#if FLEX_CUDA
            computeType = Flex.ComputeType.CUDA,
#else
            computeType = Flex.ComputeType.D3D11,
#endif
            renderContext = default(IntPtr),
            renderDevice  = default(IntPtr)
        };
        Flex.Library    lib    = Flex.Init(Flex.FLEX_VERSION, ErrorCallback, ref desc);
        Flex.SolverDesc slvDsc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref slvDsc);
        slvDsc.maxParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref slvDsc);

        FlexExt.Container container = FlexExt.CreateContainer(lib, solver, 10000);
        FlexExt.DestroyContainer(container);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
    public void TestCreateDestroyInstance()
    {
        Flex.Library    lib    = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc slvDsc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref slvDsc);
        slvDsc.maxParticles = 1000;
        Flex.Solver       solver    = Flex.CreateSolver(lib, ref slvDsc);
        FlexExt.Container container = FlexExt.CreateContainer(lib, solver, 1000);

        FlexExt.Asset.Handle asset = CreateTestClothAsset();

        FlexExt.ParticleData data = FlexExt.MapParticleData(container);

        Matrix4x4 transform = Matrix4x4.identity;

        FlexExt.Instance.Handle instance = FlexExt.CreateInstance(container, ref data, asset, ref transform, 1.0f, 1.0f, 1.0f, Flex.MakePhase(1, Flex.Phase.Default), 1.0f);

        Assert.AreEqual(asset.asset.numParticles, instance.instance.numParticles);

        FlexExt.DestroyInstance(container, instance);

        FlexExt.UnmapParticleData(container);

        FlexExt.DestroyAsset(asset);

        FlexExt.DestroyContainer(container);
        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #3
0
    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);
        }
    }
Exemple #4
0
    public void TestSetParticlesPhases()
    {
        float DELTA_T = 0.016f;
        float INTERACTION_DISTANCE = 0.5f;
        float SOLID_REST_DISTANCE  = 0.2f;

        Flex.Library    lib  = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.Params prms = new Flex.Params();
        Flex.GetParams(solver, ref prms);
        prms.radius            = INTERACTION_DISTANCE;
        prms.solidRestDistance = SOLID_REST_DISTANCE;
        Flex.SetParams(solver, ref prms);

        Flex.Buffer particles = CreateBuffer(lib, 2, 4, new float[]
        {
            -0.001f, 0.0f, 0.0f, 1.0f,
            0.001f, 0.0f, 0.0f, 1.0f,
        });
        Flex.SetParticles(solver, particles);

        Flex.Buffer phases = CreateBuffer(lib, 2, 1, new int[]
        {
            Flex.MakePhase(1, Flex.Phase.SelfCollide),
            Flex.MakePhase(1, Flex.Phase.SelfCollide),
        });
        Flex.SetPhases(solver, phases);

        Flex.SetActiveCount(solver, 2);

        Flex.Buffer active = CreateBuffer(lib, 2, 1, new int[]
        {
            0, 1,
        });
        Flex.SetActive(solver, active);

        Flex.UpdateSolver(solver, DELTA_T, 1);

        Flex.GetParticles(solver, particles);
        float[] values; ReadBuffer(lib, particles, 2, 4, out values);

        Assert.AreEqual(SOLID_REST_DISTANCE, Vector3.Distance(new Vector3(values[0], values[1], values[2]), new Vector3(values[4], values[5], values[6])));

        Flex.FreeBuffer(particles);
        Flex.FreeBuffer(phases);
        Flex.FreeBuffer(active);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #5
0
    public void TestSetSpringConstraints()
    {
        float DELTA_T = 0.016f;
        float INTERACTION_DISTANCE = 0.5f;
        float SOLID_REST_DISTANCE  = 0.2f;
        float SPRING_LENGTH        = 1.0f;

        Flex.Library    lib  = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.Params prms = new Flex.Params();
        Flex.GetParams(solver, ref prms);
        prms.radius            = INTERACTION_DISTANCE;
        prms.solidRestDistance = SOLID_REST_DISTANCE;
        Flex.SetParams(solver, ref prms);

        Flex.Buffer particles = CreateBuffer(lib, 2, 4, new float[]
        {
            -0.001f, 0.0f, 0.0f, 1.0f,
            0.001f, 0.0f, 0.0f, 1.0f,
        });
        Flex.SetParticles(solver, particles);

        Flex.Buffer indices   = CreateBuffer(lib, 2, 1, new int[] { 0, 1 });
        Flex.Buffer lengths   = CreateBuffer(lib, 1, 1, new float[] { SPRING_LENGTH });
        Flex.Buffer stiffness = CreateBuffer(lib, 1, 1, new float[] { 1.0f });
        Flex.SetSprings(solver, indices, lengths, stiffness, 1);

        Flex.SetActiveCount(solver, 2);

        Flex.Buffer active = CreateBuffer(lib, 2, 1, new int[] { 0, 1 });
        Flex.SetActive(solver, active);

        Flex.UpdateSolver(solver, DELTA_T, 1);

        Flex.GetParticles(solver, particles);
        float[] values; ReadBuffer(lib, particles, 2, 4, out values);

        Assert.AreEqual(SPRING_LENGTH, Vector3.Distance(new Vector3(values[0], values[1], values[2]), new Vector3(values[4], values[5], values[6])), 0.001f);

        Flex.FreeBuffer(particles);
        Flex.FreeBuffer(indices);
        Flex.FreeBuffer(lengths);
        Flex.FreeBuffer(stiffness);
        Flex.FreeBuffer(active);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #6
0
    public void TestCreateDestroySolver()
    {
        Flex.Library lib = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);

        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);
        Flex.DestroySolver(solver);

        Flex.Shutdown(lib);
    }
Exemple #7
0
    public void TestSetGetParticlesVelocities()
    {
        Vector3 GRAVITY = new Vector3(1, 2, 3);
        float   DELTA_T = 0.016f;

        Flex.Library    lib  = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.Params prms = new Flex.Params();
        Flex.GetParams(solver, ref prms);
        prms.gravity = GRAVITY;
        Flex.SetParams(solver, ref prms);

        Flex.Buffer particles = CreateBuffer(lib, 1, 4, new float[]
        {
            0.0f, 0.0f, 0.0f, 1.0f,
        });
        Flex.SetParticles(solver, particles);

        Flex.Buffer velocities = CreateBuffer(lib, 1, 3, new float[]
        {
            0.0f, 0.0f, 0.0f,
        });
        Flex.SetVelocities(solver, velocities);

        Flex.SetActiveCount(solver, 1);

        Flex.Buffer active = CreateBuffer(lib, 1, 1, new int[]
        {
            0
        });
        Flex.SetActive(solver, active);

        Flex.UpdateSolver(solver, DELTA_T, 1);

        Flex.GetVelocities(solver, velocities);
        float[] values; ReadBuffer(lib, velocities, 1, 3, out values);

        Assert.AreEqual(GRAVITY * DELTA_T, new Vector3(values[0], values[1], values[2]));

        Flex.FreeBuffer(particles);
        Flex.FreeBuffer(velocities);
        Flex.FreeBuffer(active);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
    public void TestCreateDestroyContainer()
    {
        Flex.Library    lib    = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc slvDsc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref slvDsc);
        slvDsc.maxParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref slvDsc);

        FlexExt.Container container = FlexExt.CreateContainer(lib, solver, 10000);
        FlexExt.DestroyContainer(container);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #9
0
    public void TestParamsPlaneCollision()
    {
        float   DELTA_T = 0.016f;
        float   INTERACTION_DISTANCE = 0.5f;
        float   SOLID_REST_DISTANCE  = 0.2f;
        Vector3 GRAVITY = new Vector3(0, -9.81f, 0);

        Flex.Library    lib  = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 0;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.Params prms = new Flex.Params();
        Flex.GetParams(solver, ref prms);
        prms.radius            = INTERACTION_DISTANCE;
        prms.solidRestDistance = SOLID_REST_DISTANCE;
        prms.gravity           = GRAVITY;
        prms.plane0            = new Vector4(0.0f, 1.0f, 0.0f, 0.0f);
        prms.numPlanes         = 1;
        Flex.SetParams(solver, ref prms);

        Flex.Buffer particles = CreateBuffer(lib, 1, 4, new float[] { 0.0f, 2.0f, 0.0f, 1.0f });
        Flex.SetParticles(solver, particles);

        Flex.SetActiveCount(solver, 1);

        Flex.Buffer   active = CreateBuffer(lib, 1, 1, new int[] { 0 });
        Flex.CopyDesc cpyDsc; cpyDsc.srcOffset = cpyDsc.dstOffset = 0; cpyDsc.elementCount = 1;
        Flex.SetActive(solver, active, ref cpyDsc);

        for (int i = 0; i < 100; ++i)
        {
            Flex.UpdateSolver(solver, DELTA_T, 1);
        }

        Flex.GetParticles(solver, particles);
        float[] values; ReadBuffer(lib, particles, 1, 4, out values);

        Assert.AreEqual(0, values[1], 0.001f);

        Flex.FreeBuffer(active);
        Flex.FreeBuffer(particles);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
    public void TestLockUnlockShapeData()
    {
        Flex.Library    lib    = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc slvDsc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref slvDsc);
        slvDsc.maxParticles = 1000;
        Flex.Solver       solver    = Flex.CreateSolver(lib, ref slvDsc);
        FlexExt.Container container = FlexExt.CreateContainer(lib, solver, 1000);

        FlexExt.ShapeData data = FlexExt.MapShapeData(container);

        Assert.AreNotEqual(IntPtr.Zero, data.positions);

        FlexExt.UnmapShapeData(container);

        FlexExt.DestroyContainer(container);
        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #11
0
    public void TestRegisterSolverCallback()
    {
        Flex.Library lib = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);

        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.SolverCallback callback;
        callback.userData = new IntPtr(1);
        callback.function = (p) => { Assert.AreEqual(callback.userData, p.userData); };
        Flex.SolverCallback oldCallback = Flex.RegisterSolverCallback(solver, callback, Flex.SolverCallbackStage.SubstepBegin);
        Assert.AreNotEqual(callback.userData, oldCallback.userData);

        Flex.DestroySolver(solver);

        Flex.Shutdown(lib);
    }
Exemple #12
0
        void CreateContainer()
        {
            AcquireLibrary();

            if (sm_libraryHandle)
            {
                Flex.SolverDesc desc = default(Flex.SolverDesc);
                Flex.SetSolverDescDefaults(ref desc);
                desc.maxParticles            = m_maxParticles;
                desc.maxDiffuseParticles     = m_maxDiffuse;
                desc.maxNeighborsPerParticle = m_maxNeighbors;
                desc.maxContactsPerParticle  = m_maxContacts;
                m_solverHandle = Flex.CreateSolver(sm_libraryHandle, ref desc);
            }

            if (m_solverHandle)
            {
                m_containerHandle = FlexExt.CreateContainer(sm_libraryHandle, m_solverHandle, m_maxParticles);
            }

            if (m_containerHandle)
            {
                m_particleBuffer = new ComputeBuffer(m_maxParticles, 16);

                m_flexScene = new GameObject("FlexScene").AddComponent <FlexScene>();
                m_flexScene.gameObject.hideFlags = HideFlags.DontSave | HideFlags.HideInHierarchy;
                m_flexScene.container            = this;
                m_flexScene.fixedUpdate         += FixedUpdate;
                m_flexScene.update += Update;
                m_flexScene.onGUI  += OnGUI;
                GameObject detectShapesObject = new GameObject("FlexDetectShapes");
                detectShapesObject.hideFlags          = HideFlags.DontSave;
                detectShapesObject.transform.parent   = m_flexScene.transform;
                detectShapesObject.transform.position = Vector3.up * float.MaxValue; // @@@
                detectShapesObject.transform.rotation = Quaternion.identity;
                m_detectShapesHelper = detectShapesObject.AddComponent <_auxFlexDetectShapes>();
            }
        }
    public void TestAllocateFreeParticles()
    {
        Flex.Library    lib    = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc slvDsc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref slvDsc);
        slvDsc.maxParticles = 1000;
        Flex.Solver       solver    = Flex.CreateSolver(lib, ref slvDsc);
        FlexExt.Container container = FlexExt.CreateContainer(lib, solver, 1000);

        int n = 1000;

        int[] indices = new int[n];

        int m = FlexExt.AllocParticles(container, n, ref indices[0]);

        Assert.AreEqual(n, m);

        FlexExt.FreeParticles(container, n, ref indices[0]);

        FlexExt.DestroyContainer(container);
        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #14
0
    public void TestSetGetActive()
    {
        Flex.Library    lib  = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.SetActiveCount(solver, 2);

        Flex.Buffer active = CreateBuffer(lib, 2, 1, new int[]
        {
            2, 1
        });
        Flex.SetActive(solver, active);

        Assert.AreEqual(2, Flex.GetActiveCount(solver));

        Flex.FreeBuffer(active);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #15
0
    public void TestSetGetParams()
    {
        Vector3 GRAVITY = new Vector3(1, 2, 3);

        Flex.Library    lib  = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.Params prms = new Flex.Params();

        Flex.GetParams(solver, ref prms);
        Assert.AreNotEqual(GRAVITY, prms.gravity);

        prms.gravity = GRAVITY;

        Flex.SetParams(solver, ref prms);
        Assert.AreEqual(GRAVITY, prms.gravity);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }
Exemple #16
0
    public void TestSetRigidsGetTransforms()
    {
        float   DELTA_T = 0.016f;
        float   INTERACTION_DISTANCE = 0.5f;
        float   SOLID_REST_DISTANCE  = 0.2f;
        Vector3 GRAVITY = new Vector3(1, 2, 3);

        Flex.Library    lib  = Flex.Init(Flex.FLEX_VERSION, ErrorCallback);
        Flex.SolverDesc desc = default(Flex.SolverDesc);
        Flex.SetSolverDescDefaults(ref desc);
        desc.maxParticles        = 1000;
        desc.maxDiffuseParticles = 1000;
        Flex.Solver solver = Flex.CreateSolver(lib, ref desc);

        Flex.Params prms = new Flex.Params();
        Flex.GetParams(solver, ref prms);
        prms.radius            = INTERACTION_DISTANCE;
        prms.solidRestDistance = SOLID_REST_DISTANCE;
        prms.gravity           = GRAVITY;
        Flex.SetParams(solver, ref prms);

        Flex.Buffer particles = CreateBuffer(lib, 8, 4, new float[]
        {
            0.1f, 0.1f, 0.1f, 1.0f, -0.1f, 0.1f, 0.1f, 1.0f, -0.1f, -0.1f, 0.1f, 1.0f, 0.1f, -0.1f, 0.1f, 1.0f,
            0.1f, 0.1f, -0.1f, 1.0f, -0.1f, 0.1f, -0.1f, 1.0f, -0.1f, -0.1f, -0.1f, 1.0f, 0.1f, -0.1f, -0.1f, 1.0f,
        });
        Flex.SetParticles(solver, particles);

        Flex.Buffer active = CreateBuffer(lib, 8, 1, new int[] { 0, 1, 2, 3, 4, 5, 6, 7 });
        Flex.SetActive(solver, active);

        Flex.Buffer offsets   = CreateBuffer(lib, 2, 1, new int[] { 0, 8 });
        Flex.Buffer indices   = CreateBuffer(lib, 8, 1, new int[] { 0, 1, 2, 3, 4, 5, 6, 7 });
        Flex.Buffer positions = CreateBuffer(lib, 8, 3, new float[]
        {
            0.1f, 0.1f, 0.1f, -0.1f, 0.1f, 0.1f, -0.1f, -0.1f, 0.1f, 0.1f, -0.1f, 0.1f,
            0.1f, 0.1f, -0.1f, -0.1f, 0.1f, -0.1f, -0.1f, -0.1f, -0.1f, 0.1f, -0.1f, -0.1f,
        });
        const float N = 0.57735026918962576450914878050196f; // 1 / sqrt(3)

        Flex.Buffer normals = CreateBuffer(lib, 8, 4, new float[]
        {
            N, N, N, 0, -N, N, N, 0, -N, -N, N, 0, N, -N, N, 0,
            N, N, -N, 0, -N, N, -N, 0, -N, -N, -N, 0, N, -N, -N, 0,
        });
        Flex.Buffer stiffness    = CreateBuffer(lib, 1, 1, new float[] { 1.0f });
        Flex.Buffer thresholds   = CreateBuffer(lib, 1, 1, new float[] { 1.0f });
        Flex.Buffer creeps       = CreateBuffer(lib, 1, 1, new float[] { 1.0f });
        Flex.Buffer rotations    = CreateBuffer(lib, 1, 4, new float[] { 0.0f, 0.0f, 0.0f, 1.0f });
        Flex.Buffer translations = CreateBuffer(lib, 1, 3, new float[] { 0.0f, 0.0f, 0.0f });

        Flex.SetRigids(solver, offsets, indices, positions, normals, stiffness, thresholds, creeps, rotations, translations, 1, 8);

        Flex.UpdateSolver(solver, DELTA_T, 1);

        Flex.Buffer nullBuffer = default(Flex.Buffer);
        Flex.GetRigids(solver, nullBuffer, nullBuffer, nullBuffer, nullBuffer, nullBuffer, nullBuffer, nullBuffer, rotations, translations);

        float[] values; ReadBuffer(lib, translations, 1, 3, out values);
        Vector3 expectedPosition = GRAVITY * DELTA_T * DELTA_T;
        Vector3 currentPosition  = new Vector3(values[0], values[1], values[2]);

        Assert.AreEqual(expectedPosition.magnitude, currentPosition.magnitude, 0.001f);

        Flex.FreeBuffer(translations);
        Flex.FreeBuffer(rotations);
        Flex.FreeBuffer(creeps);
        Flex.FreeBuffer(thresholds);
        Flex.FreeBuffer(stiffness);
        Flex.FreeBuffer(normals);
        Flex.FreeBuffer(positions);
        Flex.FreeBuffer(indices);
        Flex.FreeBuffer(offsets);

        Flex.FreeBuffer(active);
        Flex.FreeBuffer(particles);

        Flex.DestroySolver(solver);
        Flex.Shutdown(lib);
    }