Example #1
0
        static bool AreEqual(TexcoordData lhs, TexcoordData rhs, int size, ref string why)
        {
            switch (size)
            {
            case 0: return(true);

            case 2: return(ElementEqual(lhs.v2, rhs.v2, ref why));

            case 3: return(ElementEqual(lhs.v3, rhs.v3, ref why));

            case 4: return(ElementEqual(lhs.v4, rhs.v4, ref why));

            default: return(false);
            }
        }
Example #2
0
    private void PopulateUv(
        int channel, TiltBrush.GeometryPool pool, GlTF_Accessor accessor,
        Semantic semantic)
    {
        bool packVertId = m_layout.PackVertexIdIntoTexcoord1W && channel == 1;

        if (packVertId)
        {
            // Guaranteed by GlTF_VertexLayout
            Debug.Assert(m_layout.m_tbLayout.GetTexcoordInfo(channel).size == 3);
            Debug.Assert(m_layout.GetTexcoordSize(channel) == 4);
        }
        if (accessor == null)
        {
            return;
        }
        if (channel < 0 || channel > 3)
        {
            throw new ArgumentException("Invalid channel");
        }
        TiltBrush.GeometryPool.TexcoordData texcoordData = pool.GetTexcoordData(channel);

        if (semantic == Semantic.XyIsUvZIsDistance && accessor.type != GlTF_Accessor.Type.VEC3)
        {
            throw new ArgumentException("XyIsUvZIsDistance semantic can only be applied to VEC3");
        }

        bool flipY;

        if (semantic == Semantic.Unspecified && channel == 0 &&
            accessor.type == GlTF_Accessor.Type.VEC2)
        {
            Debug.LogWarning("Assuming Semantic.XyIsUv");
            semantic = Semantic.XyIsUv;
        }
        switch (semantic)
        {
        case Semantic.Position:
        case Semantic.Vector:
        case Semantic.Timestamp:
            flipY = false;
            break;

        case Semantic.XyIsUvZIsDistance:
        case Semantic.XyIsUv:
            flipY = true;
            break;

        default:
            throw new ArgumentException("semantic");
        }

        switch (accessor.type)
        {
        case GlTF_Accessor.Type.SCALAR:
            throw new NotImplementedException();

        case GlTF_Accessor.Type.VEC2:
            accessor.Populate(texcoordData.v2, flipY: flipY, calculateMinMax: false);
            break;

        case GlTF_Accessor.Type.VEC3:
            accessor.Populate(texcoordData.v3, flipY: flipY, calculateMinMax: false);
            break;

        case GlTF_Accessor.Type.VEC4:
            if (packVertId)
            {
                // In the vertexId case, we actually have a vec3, which needs to be augmented to a vec4.
                // TODO: this should happen at some higher level.
                int i  = 0;
                var v4 = texcoordData.v3.ConvertAll <Vector4>((v => new Vector4(v.x, v.y, v.z, i++)));
                accessor.Populate(v4, flipY: flipY, calculateMinMax: false);
            }
            else
            {
                accessor.Populate(texcoordData.v4, flipY: flipY, calculateMinMax: false);
            }
            break;

        default:
            throw new ArgumentException("Unexpected accessor.type");
        }
    }