Esempio n. 1
0
        private unsafe void RenderMeshWithoutColors(
            ArchetypeChunkSharedComponentType <RenderMesh> renderMeshType,
            ArchetypeChunkComponentType <LocalToWorld> localToWorldType)
        {
            var chunks = this.renderMeshWithoutColors.CreateArchetypeChunkArray(Allocator.TempJob);

            for (int i = 0; i < chunks.Length; i++)
            {
                var chunk             = chunks[i];
                var renderMesh        = chunk.GetSharedComponentData(renderMeshType, this.EntityManager);
                var localToWorldArray = chunk.GetNativeArray(localToWorldType);

                var matrix4x4Array = new Matrix4x4[chunk.Count];
                fixed(void *matrixPointer = &matrix4x4Array[0])
                {
                    var localToWorldPointer = localToWorldArray.GetUnsafeReadOnlyPtr();

                    UnsafeUtility.MemCpy(matrixPointer, localToWorldPointer, sizeof(Matrix4x4) * chunk.Count);
                }

                Graphics.DrawMeshInstanced(renderMesh.Mesh, 0, renderMesh.Material, matrix4x4Array);
            }

            chunks.Dispose();
        }
Esempio n. 2
0
        protected unsafe override JobHandle OnUpdate(JobHandle inputDeps)
        {
            var sys = World.GetExistingSystem <RendererBGFXSystem>();

            if (!sys.Initialized)
            {
                return(inputDeps);
            }

            var chunks = m_query.CreateArchetypeChunkArray(Allocator.Temp);
            NativeArray <Entity> sharedRenderToPass = new NativeArray <Entity>(chunks.Length, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
            NativeArray <Entity> sharedLightingRef  = new NativeArray <Entity>(chunks.Length, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
            ArchetypeChunkSharedComponentType <RenderToPasses> renderToPassesType = GetArchetypeChunkSharedComponentType <RenderToPasses>();
            ArchetypeChunkSharedComponentType <LightingRef>    lightingRefType    = GetArchetypeChunkSharedComponentType <LightingRef>();

            // it really sucks we can't get shared components in the job itself
            for (int i = 0; i < chunks.Length; i++)
            {
                sharedRenderToPass[i] = chunks[i].GetSharedComponentData <RenderToPasses>(renderToPassesType, EntityManager).e;
                sharedLightingRef[i]  = chunks[i].GetSharedComponentData <LightingRef>(lightingRefType, EntityManager).e;
            }
            chunks.Dispose();

            var encodejob = new SubmitSimpleLitMeshJob {
                LocalToWorldType             = GetArchetypeChunkComponentType <LocalToWorld>(true),
                MeshRendererType             = GetArchetypeChunkComponentType <MeshRenderer>(true),
                LitMeshType                  = GetArchetypeChunkComponentType <LitMeshReference>(true),
                WorldBoundsType              = GetArchetypeChunkComponentType <WorldBounds>(true),
                WorldBoundingSphereType      = GetArchetypeChunkComponentType <WorldBoundingSphere>(true),
                ChunkWorldBoundingSphereType = GetArchetypeChunkComponentType <ChunkWorldBoundingSphere>(true),
                ChunkWorldBoundsType         = GetArchetypeChunkComponentType <ChunkWorldBounds>(true),
                SharedRenderToPass           = sharedRenderToPass,
                SharedLightingRef            = sharedLightingRef,
                BufferRenderToPassesEntry    = GetBufferFromEntity <RenderToPassesEntry>(true),
                ComponentSimpleMeshBGFX      = GetComponentDataFromEntity <SimpleMeshBGFX>(true),
                ComponentMeshRenderData      = GetComponentDataFromEntity <LitMeshRenderData>(true),
                ComponentRenderPass          = GetComponentDataFromEntity <RenderPass>(true),
                ComponentLitMaterialBGFX     = GetComponentDataFromEntity <LitMaterialBGFX>(true),
                ComponentLightingBGFX        = GetComponentDataFromEntity <LightingBGFX>(true),
                ComponentFrustum             = GetComponentDataFromEntity <Frustum>(true),
                PerThreadData                = sys.m_perThreadDataPtr,
                MaxPerThreadData             = sys.m_maxPerThreadData,
                BGFXSystem = World.GetExistingSystem <RendererBGFXSystem>()
            };

            var encodejobHandle = encodejob.Schedule(m_query, inputDeps);

            return(encodejobHandle);
        }
Esempio n. 3
0
        protected override void OnUpdate()
        {
            ArchetypeChunkSharedComponentType <RenderMesh> renderMeshType   = this.GetArchetypeChunkSharedComponentType <RenderMesh>();
            ArchetypeChunkSharedComponentType <MatProps>   matPropsType     = this.GetArchetypeChunkSharedComponentType <MatProps>();
            ArchetypeChunkComponentType <LocalToWorld>     localToWorldType = this.GetArchetypeChunkComponentType <LocalToWorld>();
            ArchetypeChunkComponentType <MeshColor>        meshColorType    = this.GetArchetypeChunkComponentType <MeshColor>();
            ArchetypeChunkEntityType archetypeChunkEntityType = this.GetArchetypeChunkEntityType();

            this.AddMatPropsForColorMesh(archetypeChunkEntityType);

            this.withColorsMarker.Begin();
            this.RenderMeshWithColors(renderMeshType, matPropsType, localToWorldType, meshColorType);
            this.withColorsMarker.End();

            this.withoutColorsMarker.Begin();
            this.RenderMeshWithoutColors(renderMeshType, localToWorldType);
            this.withoutColorsMarker.End();
        }
        private void NewMethod(FrozenRenderSceneTag tag, NativeArray <ArchetypeChunk> chunks,
                               NativeArray <int> sharedRendererCounts,
                               NativeArray <int> sortedChunkIndices, int sharedRenderCount,
                               ArchetypeChunkComponentType <RenderMeshFlippedWindingTag> meshInstanceFlippedTagType,
                               ArchetypeChunkSharedComponentType <EditorRenderData> editorRenderDataType,
                               ArchetypeChunkSharedComponentType <RenderMesh> RenderMeshType)
        {
            var job = new BatchingJob()
            {
                NativeEditorRenderDataIndex = new NativeList <int>(Allocator.TempJob),
                NativeDataArray1            = new NativeList <int4>(Allocator.TempJob),
                NativeFlipped        = new NativeList <bool>(Allocator.TempJob),
                SharedRendererCounts = sharedRendererCounts,
                SortedChunkIndices   = sortedChunkIndices,
                Chunks                     = chunks,
                SharedRenderCount          = sharedRenderCount,
                MeshInstanceFlippedTagType = meshInstanceFlippedTagType,
                EditorRenderDataType       = editorRenderDataType,
                RenderMeshType             = RenderMeshType
            };

            job.Run();

            for (int i = 0; i < job.NativeDataArray1.Length; i++)
            {
                var editorDataIndex = job.NativeEditorRenderDataIndex[i];
                EditorRenderData editorRenderData = m_DefaultEditorRenderData;

                if (editorDataIndex != -1)
                {
                    editorRenderData = EntityManager.GetSharedComponentData <EditorRenderData>(editorDataIndex);
                }

                var data1 = job.NativeDataArray1[i];

                m_InstancedRenderMeshBatchGroup.AddBatch(tag, data1.x,
                                                         data1.z, chunks, sortedChunkIndices, data1.y,
                                                         data1.w, job.NativeFlipped[i],
                                                         editorRenderData);
            }

            job.Dispose();
        }
Esempio n. 5
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            ArchetypeChunkSharedComponentType <SpriteAsset> assetType      = GetArchetypeChunkSharedComponentType <SpriteAsset>();
            ArchetypeChunkComponentType <SpriteVertexData>  spriteDataType = GetArchetypeChunkComponentType <SpriteVertexData>();

            using (var chunkArray = m_SpriteAssetGroup.CreateArchetypeChunkArray(Unity.Collections.Allocator.TempJob))
            {
                foreach (var chunk in chunkArray)
                {
                    var spriteDataArray = chunk.GetNativeArray(spriteDataType);
                    var asset           = chunk.GetSharedComponentData(assetType, EntityManager);
                    var spriteData      = SpriteUtility.GetSpriteVertexData(asset.Value);
                    spriteData.NativeMaterialId = chunk.GetSharedComponentIndex(assetType);
                    for (int i = 0; i < chunk.Count; i++)
                    {
                        spriteDataArray[i] = spriteData;
                    }
                    //chunk.SetChunkComponentData(spriteDataType, spriteData);
                }
            }
            EntityManager.AddComponent(m_SpriteAssetGroup, typeof(SpriteAssetInitialized));
            return(inputDeps);
        }
Esempio n. 6
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            ArchetypeChunkSharedComponentType <LegacyTextFontMaterial> materialType = GetArchetypeChunkSharedComponentType <LegacyTextFontMaterial>();
            ArchetypeChunkComponentType <TextFontAsset> fontType = GetArchetypeChunkComponentType <TextFontAsset>();

            using (var chunkArray = m_FontAssetGroup.CreateArchetypeChunkArray(Unity.Collections.Allocator.TempJob))
            {
                foreach (var chunk in chunkArray)
                {
                    var fontAssetArray = chunk.GetNativeArray(fontType);
                    var nativeId       = chunk.GetSharedComponentIndex(materialType);
                    for (int i = 0; i < chunk.Count; i++)
                    {
                        var fontData = fontAssetArray[i];
                        fontData.NativeMaterialId = nativeId;
                        fontAssetArray[i]         = fontData;
                    }
                    //chunk.SetChunkComponentData(spriteDataType, spriteData);
                }
            }
            EntityManager.AddComponent(m_FontAssetGroup, typeof(FontAssetInitialized));
            return(inputDeps);
        }
 public void ScheduleTimeInitialize(ComponentSystemBase jobComponentSystem, bool isReadOnly)
 {
     _type          = jobComponentSystem.GetArchetypeChunkSharedComponentType <T>();
     _entityManager = jobComponentSystem.EntityManager;
 }
        private void OldMethod(FrozenRenderSceneTag tag, NativeArray <ArchetypeChunk> chunks,
                               NativeArray <int> sharedRendererCounts,
                               NativeArray <int> sortedChunkIndices, int sharedRenderCount,
                               ArchetypeChunkComponentType <RenderMeshFlippedWindingTag> meshInstanceFlippedTagType,
                               ArchetypeChunkSharedComponentType <EditorRenderData> editorRenderDataType,
                               ArchetypeChunkSharedComponentType <RenderMesh> RenderMeshType)
        {
            var sortedChunkIndex = 0;

            for (int i = 0; i < sharedRenderCount; i++)
            {
                var startSortedChunkIndex = sortedChunkIndex;
                var endSortedChunkIndex   = startSortedChunkIndex + sharedRendererCounts[i];

                while (sortedChunkIndex < endSortedChunkIndex)
                {
                    var chunkIndex = sortedChunkIndices[sortedChunkIndex];
                    var chunk      = chunks[chunkIndex];
                    var rendererSharedComponentIndex = chunk.GetSharedComponentIndex(RenderMeshType);

                    var editorRenderDataIndex = chunk.GetSharedComponentIndex(editorRenderDataType);
                    var editorRenderData      = m_DefaultEditorRenderData;
                    if (editorRenderDataIndex != -1)
                    {
                        editorRenderData =
                            EntityManager.GetSharedComponentData <EditorRenderData>(editorRenderDataIndex);
                    }

                    var remainingEntitySlots = 1023;
                    var flippedWinding       = chunk.Has(meshInstanceFlippedTagType);
                    int instanceCount        = chunk.Count;
                    int startSortedIndex     = sortedChunkIndex;
                    int batchChunkCount      = 1;

                    remainingEntitySlots -= chunk.Count;
                    sortedChunkIndex++;

                    while (remainingEntitySlots > 0)
                    {
                        if (sortedChunkIndex >= endSortedChunkIndex)
                        {
                            break;
                        }

                        var nextChunkIndex = sortedChunkIndices[sortedChunkIndex];
                        var nextChunk      = chunks[nextChunkIndex];
                        if (nextChunk.Count > remainingEntitySlots)
                        {
                            break;
                        }

                        var nextFlippedWinding = nextChunk.Has(meshInstanceFlippedTagType);
                        if (nextFlippedWinding != flippedWinding)
                        {
                            break;
                        }

                        #if UNITY_EDITOR
                        if (editorRenderDataIndex != nextChunk.GetSharedComponentIndex(editorRenderDataType))
                        {
                            break;
                        }
                        #endif

                        remainingEntitySlots -= nextChunk.Count;
                        instanceCount        += nextChunk.Count;
                        batchChunkCount++;
                        sortedChunkIndex++;
                    }

                    m_InstancedRenderMeshBatchGroup.AddBatch(tag, rendererSharedComponentIndex, instanceCount, chunks,
                                                             sortedChunkIndices, startSortedIndex, batchChunkCount, flippedWinding, editorRenderData);
                }
            }
        }