예제 #1
0
    /// <summary>
    /// Start this instance.
    /// Initializes all buffers and other resources needed by tressfx simulation and rendering.
    /// </summary>
    public void Start()
    {
        // Vertex buffers
        this.g_HairVertexPositions = this.InitializeBuffer (this.hairData.m_pVertices, 16);
        this.g_HairVertexPositionsPrev = this.InitializeBuffer (this.hairData.m_pVertices, 16);
        this.g_InitialHairPositions = this.InitializeBuffer (this.hairData.m_pVertices, 16);

        // Tangents and rotations
        this.g_HairVertexTangents = this.InitializeBuffer (this.hairData.m_pTangents, 16);
        this.g_GlobalRotations = this.InitializeBuffer (this.hairData.m_pGlobalRotations, 16);
        this.g_LocalRotations = this.InitializeBuffer (this.hairData.m_pLocalRotations, 16);

        // Others
        this.g_HairRestLengthSRV = this.InitializeBuffer (this.hairData.m_pRestLengths, 4);
        this.g_HairStrandType = this.InitializeBuffer (this.hairData.m_pHairStrandType, 4);
        this.g_HairRefVecsInLocalFrame = this.InitializeBuffer (this.hairData.m_pRefVectors, 16);
        this.g_FollowHairRootOffset = this.InitializeBuffer (this.hairData.m_pFollowRootOffset, 16);
        this.g_HairThicknessCoeffs = this.InitializeBuffer (this.hairData.m_pThicknessCoeffs, 4);

        // Get other parts
        this.simulation = this.GetComponent<TressFXSimulation> ();
    }
예제 #2
0
    /// <summary>
    /// This initializes tressfx and all of it's components.
    /// This function gets called from the TressFX Loader.
    /// </summary>
    /// <param name="vertices">Vertices.</param>
    /// <param name="strandIndices">Strand indices.</param>
    public void Initialize(TressFXStrand[] strands, int numVertices, int hairCount)
    {
        // Initialize data
        this.vertexCount = numVertices;
        this.strandCount = strands.Length;
        this.strands     = strands;
        this.hairCount   = hairCount;
        this.globalToLocalVertexIndexMappings = new Dictionary <int, int> ();
        this.hairData = this.GetComponent <TressFXLoader> ().hairs;

        // Buffer resources
        positionVectors = new Vector4[numVertices];
        Vector4[] initialPositionVectors = new Vector4[numVertices];
        referenceVectors = new Vector3[numVertices];
        vectorTangents   = new Vector3[numVertices];
        hairRestLengths  = new float[numVertices];
        strandIndices    = new int[numVertices];
        offsets          = new int[strands.Length];
        hairIndices      = new int[strands.Length];

        // Rotations
        localRotations  = new Quaternion[numVertices];
        globalRotations = new Quaternion[numVertices];

        // Transforms
        localTransforms  = new TressFXTransform[numVertices];
        globalTransforms = new TressFXTransform[numVertices];

        List <int> triangleIndicesList = new List <int> ();

        thicknessCoeffs = new float[numVertices];

        // Initialize transforms and fill hair and strand indices, hair rest lengths and position vectors
        int index = 0;

        this.ComputeDistanceToRoot();

        for (int i = 0; i < strands.Length; i++)
        {
            hairIndices[i] = strands[i].hairId;

            for (int j = 0; j < strands[i].vertices.Length; j++)
            {
                this.globalToLocalVertexIndexMappings.Add(index, j);

                Vector4 pos  = strands[i].GetTressFXVector(j);
                Vector3 pos3 = new Vector3(pos.x, pos.y, pos.z);
                pos3 = this.transform.position + pos3;
                Vector4 position = new Vector4(pos3.x, pos3.y, pos3.z, pos.w);

                // Load position of the strand
                positionVectors[index]        = position;
                initialPositionVectors[index] = strands[i].GetTressFXVector(j);

                // Get rest length
                if (j < strands[i].vertices.Length - 1)
                {
                    hairRestLengths[index] = (strands[i].vertices[j].pos - strands[i].vertices[j + 1].pos).magnitude;
                }
                else
                {
                    hairRestLengths[index] = 0;
                }

                // Init transforms
                globalTransforms[index]        = new TressFXTransform();
                localTransforms[index]         = new TressFXTransform();
                strands[i].localTransforms[j]  = localTransforms[index];
                strands[i].globalTransforms[j] = globalTransforms[index];

                // Set triangle indices
                if (j < strands[i].vertices.Length - 1)
                {
                    triangleIndicesList.Add(2 * index);
                    triangleIndicesList.Add(2 * index + 1);
                    triangleIndicesList.Add(2 * index + 2);
                    triangleIndicesList.Add(2 * index + 2);
                    triangleIndicesList.Add(2 * index + 1);
                    triangleIndicesList.Add(2 * index + 3);
                }

                float tVal = strands[i].vertices[j].texcoords.z;
                thicknessCoeffs[index] = Mathf.Sqrt(1.0f - tVal * tVal);

                // Set strand indices currently used for cutting linestrips by a geometry shader
                strandIndices[index] = j;
                index++;
            }

            // Set strand offsets
            offsets[i] = index;
        }

        this.ThicknessCoeffsBuffer = new ComputeBuffer(numVertices, 4);
        this.ThicknessCoeffsBuffer.SetData(thicknessCoeffs);

        this.triangleIndices       = triangleIndicesList.ToArray();
        this.TriangleIndicesBuffer = new ComputeBuffer(this.triangleIndices.Length, 4);
        this.TriangleIndicesBuffer.SetData(this.triangleIndices);

        // Initialize frames
        this.InitializeLocalGlobalFrame();

        // Compute strand tangents
        this.ComputeStrandTangents();
        this.TangentsBuffer = new ComputeBuffer(this.vectorTangents.Length, 12);
        this.TangentsBuffer.SetData(this.vectorTangents);

        // Initialize compute buffers
        this.InitialVertexPositionBuffer = new ComputeBuffer(numVertices, 16);
        this.LastVertexPositionBuffer    = new ComputeBuffer(numVertices, 16);
        this.VertexPositionBuffer        = new ComputeBuffer(numVertices, 16);
        this.StrandIndicesBuffer         = new ComputeBuffer(numVertices, 4);
        this.HairIndicesBuffer           = new ComputeBuffer(strands.Length, 4);

        this.InitialVertexPositionBuffer.SetData(initialPositionVectors);
        this.StrandIndicesBuffer.SetData(strandIndices);
        this.HairIndicesBuffer.SetData(hairIndices);

        // Initialize simulation if existing
        TressFXSimulation simulation = this.gameObject.GetComponent <TressFXSimulation>();

        if (simulation != null)
        {
            simulation.Initialize(hairRestLengths, referenceVectors, offsets, localRotations, globalRotations);
        }

        // Initialize Rendering if existing
        ATressFXRender render = this.gameObject.GetComponent <ATressFXRender>();

        if (render != null)
        {
            render.Initialize();
        }

        this.LastVertexPositionBuffer.SetData(positionVectors);
        this.VertexPositionBuffer.SetData(positionVectors);

        Debug.Log("TressFX Loaded! Hair vertices: " + this.vertexCount);
    }