public XnaBoneWeightChannel(MeshBuilder mb, VertexContainer vc, JointList joints)
                : base(mb)
            {
                try
                {
                    _indicesChannel = (from c in vc.VertexChannels
                                       where c.Contains(VertexElementUsage.BlendIndices)
                                       select c).First();

                    _weightChannel = (from c in vc.VertexChannels
                                      where c.Contains(VertexElementUsage.BlendWeight)
                                      select c).First();
                }
                catch (Exception)
                {
                    throw new Exception("Missing blend indices or weights");
                }

                _joints        = joints;
                _vertexSize    = vc.VertexSize;
                _indicesOffset = _indicesChannel.Source.Offset;
                _weightOffset  = _weightChannel.Source.Offset;

                this.Create();
            }
        void OnChannelInfoReceived(string name, ChannelInfo info)
        {
            m_containerSize = info.container_size;
            //m_packageSize = info.package_size;
            m_frameInterval  = info.frame_interval;
            m_combinedFrames = info.combined_frames;
            m_streamInfoURL  = info.stream_info;

            vPack = new VertexContainer(info.package_size, info.container_size);

#if UNITY_WEBGL
            m_audioURL = info.audio_clip;
#else
            m_audioInfoURL = info.audio_info;
#endif
            vertsBuf     = new float[info.meshes.Count][];
            vertsBuf_old = new float[info.meshes.Count][];

            m_meshSizes     = info.meshSizes;
            m_materialSizes = info.materialSizes;
            m_textureSizes  = info.textureSizes;
            m_meshNames     = info.meshes;
            m_materialNames = info.materials;
            m_textureNames  = info.textures;

            m_combinedDataURL = info.data;
            Invoke("TryRequestCombinedData", 0.1f);

            m_streamRefreshInterval = 1.0f;
        }
Esempio n. 3
0
    public void Start()
    {
        meshObjects = new Hashtable();
        basisMeshes = new Hashtable();
        for (int i = 0; i < shapeKeys.shapeKeys.Length; i++)
        {
            // Lookup the mesh and collect the list of shape keys for each mesh
            // Also grab a copy of the basis mesh so we always apply values
            // against the basis.
            GameObject meshObject = ((ShapeKey)shapeKeys.shapeKeys[i]).meshObject;
            if (!meshObjects.Contains(meshObject))
            {
                List <ShapeKey> s = new List <ShapeKey>();
                s.Add(shapeKeys.shapeKeys[i]);

                VertexContainer verts = new VertexContainer();
                verts.vertices = (Vector3[])((ShapeKey)shapeKeys.shapeKeys[i]).getVertices().Clone();
                meshObjects.Add(meshObject, s);
                basisMeshes.Add(meshObject, verts);
            }
            else
            {
                ((List <ShapeKey>)meshObjects[meshObject]).Add(shapeKeys.shapeKeys[i]);
            }
        }
    }
Esempio n. 4
0
        /// <summary>
        /// GetTriangleVertices
        /// </summary>
        /// <param name="coordinates"></param>
        /// <returns>VertexContainer</returns>
        public VertexContainer GetTriangleVertices(string coordinates)
        {
            // ROWS ARE LETTERS
            // COLUMNS ARE NUMBERS

            try
            {
                string row    = coordinates[0].ToString().ToUpper();
                string colstr = coordinates[1].ToString();
                int    col    = Convert.ToInt32(colstr);

                var vertexContainer = new VertexContainer();
                vertexContainer.Vertices = new List <Vertex>();

                Vertex v1 = new Vertex();
                Vertex v2 = new Vertex();
                Vertex v3 = new Vertex();

                int rowNum = (int)(row.ToCharArray()[0]) - 65;
                int colNum = col - 1;

                if (colNum % 2 != 0)
                {
                    // even numbered columns (e.g. A2, A4, etc.)
                    v1.X    = (colNum / 2) * 10 + 10;
                    v1.Y    = rowNum * 10 + 10;
                    v1.Name = "V1";
                    v2.X    = v1.X - 10;
                    v2.Y    = v1.Y - 10;
                    v2.Name = "V2";
                    v3.X    = v1.X;
                    v3.Y    = v1.Y - 10;
                    v3.Name = "V3";
                }
                else
                {
                    // even numbered columns (e.g. A2, A4, etc.)
                    v1.X    = (colNum / 2) * 10;
                    v1.Y    = rowNum * 10 + 10;
                    v1.Name = "V1";
                    v2.X    = v1.X;
                    v2.Y    = v1.Y - 10;
                    v2.Name = "V2";
                    v3.X    = v1.X + 10;
                    v3.Y    = v1.Y;
                    v3.Name = "V3";
                }

                vertexContainer.Vertices.Add(v1);
                vertexContainer.Vertices.Add(v2);
                vertexContainer.Vertices.Add(v3);

                return(vertexContainer);
            }
            catch
            {
                throw new Exception("Input was not in a correct format");
            }
        }
Esempio n. 5
0
        private static void AddVertexContainer(GXVertexDecompressor decom, List <VertexContainer <MeleeVertex> > vertexContainers, DatPolygon polygon, GXDisplayList displayList)
        {
            List <MeleeVertex> vertices      = new List <MeleeVertex>();
            List <int>         vertexIndices = new List <int>();

            for (int i = 0; i < displayList.Indices.Length; i++)
            {
                vertexIndices.Add(i);
            }

            vertices.AddRange(ConvertVerts(decom.GetFormattedVertices(displayList, polygon)));

            PrimitiveType primitiveType = MeleeDatToOpenGL.GetGLPrimitiveType(displayList.PrimitiveType);
            VertexContainer <MeleeVertex> vertexContainer = new VertexContainer <MeleeVertex>(vertices, vertexIndices, primitiveType);

            vertexContainers.Add(vertexContainer);
        }
Esempio n. 6
0
        public void VerifyIdInSameExpression_AllOk()
        {
            var A = new CircularEntity("A");
            var B = new CircularEntity("B");
            var D = new CircularEntity("D");

            A = A + (B + B + D) + B;
            var expression = A.AsExpression(f => f.Children);

            var vertexA = VertexContainer <CircularEntity> .GetEntityId(expression.Graph.Vertexes[0].Entity).Id;

            var vertexB = VertexContainer <CircularEntity> .GetEntityId(expression.Graph.Vertexes[1].Entity).Id;

            var vertexD = VertexContainer <CircularEntity> .GetEntityId(expression.Graph.Vertexes[2].Entity).Id;

            Assert.Equal(vertexA, expression.Graph.Vertexes[0].Id);
            Assert.Equal(vertexB, expression.Graph.Vertexes[1].Id);
            Assert.Equal(vertexD, expression.Graph.Vertexes[2].Id);
        }
Esempio n. 7
0
        public void VerifyIdentity_ShouldEqualsVertexContainer()
        {
            var A = new CircularEntity("A");
            var B = new CircularEntity("B");
            var C = new CircularEntity("C");

            A = A + (B + C);
            var expression = A.AsExpression(f => f.Children);

            var vertexA = VertexContainer <CircularEntity> .GetEntityId(A).Id;

            var vertexB = VertexContainer <CircularEntity> .GetEntityId(B).Id;

            var vertexC = VertexContainer <CircularEntity> .GetEntityId(C).Id;

            Assert.Equal(3, expression.Count);
            Assert.Equal($"[{vertexA}]", expression[0].Path.Identity);
            Assert.Equal($"[{vertexA}].[{vertexB}]", expression[1].Path.Identity);
            Assert.Equal($"[{vertexA}].[{vertexB}].[{vertexC}]", expression[2].Path.Identity);
        }
Esempio n. 8
0
        private void TestMultiLevel(Func <CircularEntity> action)
        {
            Clear();

            var objA       = action();
            var serializer = objA.AsExpression().GetSerializer <ComplexEntityExpressionSerializer>();

            serializer.GetEntityIdCallback = item => VertexContainer <object> .GetEntityId(item.Entity).Id;

            var expressionStr = serializer.Serialize();
            var deserializer  = new ComplexEntityExpressionDeserializer();

            var objB         = deserializer.Deserialize <CircularEntity>(expressionStr);
            var jsonSettings = new JsonSerializerSettings {
                Formatting = Formatting.Indented, PreserveReferencesHandling = PreserveReferencesHandling.Objects
            };

            var jsonA = JsonConvert.SerializeObject(objA, jsonSettings);
            var jsonB = JsonConvert.SerializeObject(objB, jsonSettings);

            Assert.Equal(jsonA, jsonB);
        }
    public void Start()
    {
        meshObjects = new Hashtable ();
        basisMeshes = new Hashtable ();
        for (int i = 0; i < shapeKeys.shapeKeys.Length; i++) {
            // Lookup the mesh and collect the list of shape keys for each mesh
            // Also grab a copy of the basis mesh so we always apply values
            // against the basis.
            GameObject meshObject = ((ShapeKey)shapeKeys.shapeKeys[i]).meshObject;
            if (!meshObjects.Contains(meshObject)) {
                List<ShapeKey> s = new List<ShapeKey>();
                s.Add(shapeKeys.shapeKeys[i]);

                VertexContainer verts = new VertexContainer();
                verts.vertices =  (Vector3[])((ShapeKey)shapeKeys.shapeKeys[i]).getVertices().Clone();
                meshObjects.Add(meshObject, s);
                basisMeshes.Add(meshObject, verts);
            } else {
                ((List<ShapeKey>)meshObjects[meshObject]).Add(shapeKeys.shapeKeys[i]);
            }
        }
    }
        /// <summary>
        /// Creates MeshContent instances for each mesh in the COLLADA model and attaches
        /// them to the NodeContent root.
        /// </summary>
        void CreateMeshes()
        {
            foreach (Mesh mesh in collada.Meshes)
            {
                foreach (MeshPart part in mesh.MeshParts)
                {
                    var material = materials[part.MaterialName];
                    meshBuilder = MeshBuilder.StartMesh(mesh.Name);
                    meshBuilder.SwapWindingOrder        = false;
                    meshBuilder.MergeDuplicatePositions = false;
                    meshBuilder.SetMaterial(material);
                    meshBuilder.Name = mesh.Name;

                    // Positions
                    CVertexChannel posChannel = part.Vertices.VertexChannels.Where(c =>
                                                                                   c.Description.VertexElementUsage == VertexElementUsage.Position).
                                                FirstOrDefault();

                    VertexContainer container = part.Vertices;
                    float[]         data      = container.Vertices;
                    int             posOffset = posChannel.Source.Offset;

                    for (int i = 0; i < container.Vertices.Length; i += container.VertexSize)
                    {
                        Vector3 pos = new Vector3(data[i + posOffset + 0],
                                                  data[i + posOffset + 1], data[i + posOffset + 2]);
                        meshBuilder.CreatePosition(pos);
                    }

                    // Vertex channels other than position
                    List <XnaVertexChannel> channels = new List <XnaVertexChannel>();

                    foreach (CVertexChannel cvChannel in part.Vertices.VertexChannels)
                    {
                        switch (cvChannel.Description.VertexElementUsage)
                        {
                        case VertexElementUsage.Position:
                            // Position is already created above
                            break;

                        case VertexElementUsage.BlendWeight:
                        case VertexElementUsage.BlendIndices:
                            // When bone weight collections are used these two
                            // channels get added separately later
                            if (UseBoneWeightCollection || excludeBlendWeights)
                            {
                                break;
                            }
                            else
                            {
                                goto default;
                            }

                        default:
                            // standard channel like texcoord, normal etc.
                            channels.Add(new XnaVertexChannel(meshBuilder, cvChannel));
                            break;
                        }
                    }

                    // BoneWeightCollection vertex channel
                    if (UseBoneWeightCollection && !excludeBlendWeights)
                    {
                        try
                        {
                            channels.Add(new XnaBoneWeightChannel(meshBuilder, part.Vertices,
                                                                  collada.Joints));
                        }
                        catch (Exception)
                        {
                            importerContext.Logger.LogMessage("No skinning information found");
                        }
                    }

                    // Triangles
                    for (int i = 0; i < part.Indices.Length; i += 3)
                    {
                        for (int j = i; j < i + 3; j++)
                        {
                            // Set channel components (other than position)
                            foreach (var channel in channels)
                            {
                                channel.SetData(j);
                            }

                            meshBuilder.AddTriangleVertex(part.Indices[j]);
                        }
                    }

                    MeshContent meshContent = meshBuilder.FinishMesh();

                    if (material.OpaqueData.Count > 0)
                    {
                        // Copy opaque data from material to mesh for convenience and
                        // to make it compatible to Normal Mapping sample from App Hub
                        foreach (var pair in material.OpaqueData)
                        {
                            meshContent.OpaqueData.Add(pair.Key, pair.Value);
                        }
                    }
                    else
                    {
                        importerContext.Logger.LogWarning(null, null, "No opaque data in mesh");
                    }

                    rootNode.Children.Add(meshContent);
                }
            }
        }
 public void CreateVertexContainer(int packageSize, int containerSize)
 {
     m_VertexContainer = new VertexContainer(packageSize, containerSize);
 }