示例#1
0
        public void AddChunkRenderComponent(Entity chunkRenderEntity, Entity chunkEntity, ref Chunk chunk, int materialID, int skeletonID)// byte buildState = 0)
        {
            ChunkRenderer chunkRender = new ChunkRenderer {
            };

            chunkRender.chunk      = chunkEntity;
            chunkRender.materialID = (byte)materialID;
            chunkRender.SetMetaData(voxelSpawnSystem.meta, voxelSpawnSystem.voxelIDs);
            //, ChunkSpawnSystem.maxCacheVerts, ChunkSpawnSystem.maxCacheTriangles);
            chunkRender.Value = chunk.Value;

            /*if (skeletonID != 0)
             * {
             *  chunkRender.hasWeights = 1;
             *  chunkRender.InitializeBoneWeights(ChunkSpawnSystem.maxCacheVerts,
             *      worldSpawnSystem.skeletonsMeta[chunk.worldID].data.datas);
             * }*/
            if (World.EntityManager.HasComponent <ChunkRenderer>(chunkRenderEntity))
            {
                World.EntityManager.SetComponentData(chunkRenderEntity, chunkRender);
            }
            else
            {
                World.EntityManager.AddComponentData(chunkRenderEntity, chunkRender);
            }
            ChunkSides sides = new ChunkSides();

            sides.Init(chunk.Value.voxelDimensions);
            World.EntityManager.SetComponentData(chunkRenderEntity, sides);

            ChunkMesh chunkMesh = new ChunkMesh();

            chunkMesh.Init(chunk.Value.voxelDimensions);
            World.EntityManager.SetComponentData(chunkRenderEntity, chunkMesh);
        }
        // add noise to render, using original verts and making new one
        public void UpdateRender(Entity entity, ref ChunkRenderer chunkRenderer, ref ChunkMesh chunkMesh, ref ChunkMeshAnimation chunkMeshAnimation)
        {
            if (UnityEngine.Time.time - chunkMesh.timePassed >= animationSpeed)
            {
                chunkMesh.timePassed = UnityEngine.Time.time;
                var chunk = World.EntityManager.GetComponentData <Chunk>(chunkRenderer.chunk);
                if (World.EntityManager.Exists(chunk.world) == false || !World.EntityManager.HasComponent <World>(chunk.world))
                {
                    return;
                }
                var worldComponent = World.EntityManager.GetComponentData <World>(chunk.world);
                var renderer       = World.EntityManager.GetSharedComponentData <RenderMesh>(entity);
                var mesh           = renderer.mesh;
                // apply animation
                if (World.EntityManager.HasComponent <Skeleton>(chunk.world))
                {
                    var skeleton = World.EntityManager.GetComponentData <Skeleton>(chunk.world);
                    if (skeleton.bones.Length > 0)
                    {
                        var          vertsCount    = chunkMesh.buildPointer.vertIndex;
                        float3[]     bonePositions = new float3[skeleton.bones.Length];
                        quaternion[] boneRotations = new quaternion[skeleton.bones.Length];
                        for (int i = 0; i < skeleton.bones.Length; i++)
                        {
                            var boneEntity = skeleton.bones[i];
                            //originalBonePositions[i] = World.EntityManager.GetComponentData<Bone>(boneEntity).position;
                            //bonePositions[i] = World.EntityManager.GetComponentData<Translation>(boneEntity).Value;
                            boneRotations[i] = World.EntityManager.GetComponentData <Rotation>(boneEntity).Value;
                            bonePositions[i] = World.EntityManager.GetComponentData <Translation>(boneEntity).Value - World.EntityManager.GetComponentData <Bone>(boneEntity).position;
                            //Debug.LogError(i + " - Bone Position: " + bonePositions[i]);
                        }
                        chunkMeshAnimation.SetBones(bonePositions, boneRotations);

                        var layout = new[]
                        {
                            new VertexAttributeDescriptor(UnityEngine.Rendering.VertexAttribute.Position, VertexAttributeFormat.Float32, 3),
                            new VertexAttributeDescriptor(UnityEngine.Rendering.VertexAttribute.Color, VertexAttributeFormat.Float32, 3),
                            new VertexAttributeDescriptor(UnityEngine.Rendering.VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 2),
                        };
                        mesh.SetVertexBufferParams(vertsCount, layout);
                        //mesh.SetVertexBufferData(cache.vertices, 0, 0, vertsCount);
                        mesh.SetVertexBufferData(chunkMeshAnimation.GetTempArray(), 0, 0, vertsCount);
                        mesh.UploadMeshData(false);
                        //mesh.RecalculateBounds();
                        //mesh.RecalculateNormals();
                    }
                    else
                    {
                        return;
                        //newVerts = ApplyRandomNoise(caches[zoxID.id].verts);
                    }
                }
                else
                {
                    return;
                }
            }
        }