public void DestroyDecalEntity(DecalEntity decalEntity) { if (!m_DecalEntityIndexer.IsValid(decalEntity)) { return; } var decalItem = m_DecalEntityIndexer.GetItem(decalEntity); m_DecalEntityIndexer.DestroyDecalEntity(decalEntity); int chunkIndex = decalItem.chunkIndex; int arrayIndex = decalItem.arrayIndex; DecalEntityChunk entityChunk = entityChunks[chunkIndex]; DecalCachedChunk cachedChunk = cachedChunks[chunkIndex]; DecalCulledChunk culledChunk = culledChunks[chunkIndex]; DecalDrawCallChunk drawCallChunk = drawCallChunks[chunkIndex]; int lastArrayIndex = entityChunk.count - 1; if (arrayIndex != lastArrayIndex) { m_DecalEntityIndexer.UpdateIndex(entityChunk.decalEntities[lastArrayIndex], arrayIndex); } entityChunk.RemoveAtSwapBack(arrayIndex); cachedChunk.RemoveAtSwapBack(arrayIndex); culledChunk.RemoveAtSwapBack(arrayIndex); drawCallChunk.RemoveAtSwapBack(arrayIndex); }
public DecalEntity CreateDecalEntity(DecalProjector decalProjector) { var material = decalProjector.material; if (material == null) { material = errorMaterial; } using (new ProfilingScope(null, m_AddDecalSampler)) { int chunkIndex = CreateChunkIndex(material); int entityIndex = entityChunks[chunkIndex].count; DecalEntity entity = m_DecalEntityIndexer.CreateDecalEntity(entityIndex, chunkIndex); DecalEntityChunk entityChunk = entityChunks[chunkIndex]; DecalCachedChunk cachedChunk = cachedChunks[chunkIndex]; DecalCulledChunk culledChunk = culledChunks[chunkIndex]; DecalDrawCallChunk drawCallChunk = drawCallChunks[chunkIndex]; // Make sure we have space to add new entity if (entityChunks[chunkIndex].capacity == entityChunks[chunkIndex].count) { using (new ProfilingScope(null, m_ResizeChunks)) { int newCapacity = entityChunks[chunkIndex].capacity + entityChunks[chunkIndex].capacity; newCapacity = math.max(8, newCapacity); entityChunk.SetCapacity(newCapacity); cachedChunk.SetCapacity(newCapacity); culledChunk.SetCapacity(newCapacity); drawCallChunk.SetCapacity(newCapacity); } } entityChunk.Push(); cachedChunk.Push(); culledChunk.Push(); drawCallChunk.Push(); entityChunk.decalProjectors[entityIndex] = decalProjector; entityChunk.decalEntities[entityIndex] = entity; entityChunk.transformAccessArray.Add(decalProjector.transform); UpdateDecalEntityData(entity, decalProjector); return(entity); } }
private void Execute(DecalCachedChunk cachedChunk, DecalCulledChunk culledChunk, DecalDrawCallChunk drawCallChunk, int count) { if (count == 0) { return; } DrawCallJob drawCallJob = new DrawCallJob() { decalToWorlds = cachedChunk.decalToWorlds, normalToWorlds = cachedChunk.normalToWorlds, sizeOffsets = cachedChunk.sizeOffsets, drawDistances = cachedChunk.drawDistances, angleFades = cachedChunk.angleFades, uvScaleBiases = cachedChunk.uvScaleBias, layerMasks = cachedChunk.layerMasks, sceneLayerMasks = cachedChunk.sceneLayerMasks, fadeFactors = cachedChunk.fadeFactors, boundingSpheres = cachedChunk.boundingSpheres, cameraPosition = culledChunk.cameraPosition, sceneCullingMask = culledChunk.sceneCullingMask, cullingMask = culledChunk.cullingMask, visibleDecalIndices = culledChunk.visibleDecalIndices, visibleDecalCount = culledChunk.visibleDecalCount, maxDrawDistance = m_MaxDrawDistance, decalToWorldsDraw = drawCallChunk.decalToWorlds, normalToDecalsDraw = drawCallChunk.normalToDecals, subCalls = drawCallChunk.subCalls, subCallCount = drawCallChunk.subCallCounts, }; var handle = drawCallJob.Schedule(cachedChunk.currentJobHandle); drawCallChunk.currentJobHandle = handle; cachedChunk.currentJobHandle = handle; }
private void DrawInstanced(CommandBuffer cmd, DecalEntityChunk decalEntityChunk, DecalCachedChunk decalCachedChunk, DecalDrawCallChunk decalDrawCallChunk, int passIndex) { var mesh = m_EntityManager.decalProjectorMesh; var material = GetMaterial(decalEntityChunk); decalCachedChunk.propertyBlock.SetVector("unity_LightData", new Vector4(1, 1, 1, 0)); // GetMainLight requires z component to be set int subCallCount = decalDrawCallChunk.subCallCount; for (int i = 0; i < subCallCount; ++i) { var subCall = decalDrawCallChunk.subCalls[i]; var decalToWorldSlice = decalDrawCallChunk.decalToWorlds.Reinterpret <Matrix4x4>(); NativeArray <Matrix4x4> .Copy(decalToWorldSlice, subCall.start, m_WorldToDecals, 0, subCall.count); var normalToWorldSlice = decalDrawCallChunk.normalToDecals.Reinterpret <Matrix4x4>(); NativeArray <Matrix4x4> .Copy(normalToWorldSlice, subCall.start, m_NormalToDecals, 0, subCall.count); decalCachedChunk.propertyBlock.SetMatrixArray("_NormalToWorld", m_NormalToDecals); cmd.DrawMeshInstanced(mesh, 0, material, passIndex, m_WorldToDecals, subCall.end - subCall.start, decalCachedChunk.propertyBlock); } }
private void Draw(CommandBuffer cmd, DecalEntityChunk decalEntityChunk, DecalCachedChunk decalCachedChunk, DecalDrawCallChunk decalDrawCallChunk, int passIndex) { var mesh = m_EntityManager.decalProjectorMesh; var material = GetMaterial(decalEntityChunk); decalCachedChunk.propertyBlock.SetVector("unity_LightData", new Vector4(1, 1, 1, 0)); // GetMainLight requires z component to be set int subCallCount = decalDrawCallChunk.subCallCount; for (int i = 0; i < subCallCount; ++i) { var subCall = decalDrawCallChunk.subCalls[i]; for (int j = subCall.start; j < subCall.end; ++j) { decalCachedChunk.propertyBlock.SetMatrix("_NormalToWorld", decalDrawCallChunk.normalToDecals[j]); cmd.DrawMesh(mesh, decalDrawCallChunk.decalToWorlds[j], material, 0, passIndex, decalCachedChunk.propertyBlock); } } }
private void Execute(CommandBuffer cmd, DecalEntityChunk decalEntityChunk, DecalCachedChunk decalCachedChunk, DecalDrawCallChunk decalDrawCallChunk, int count) { decalCachedChunk.currentJobHandle.Complete(); decalDrawCallChunk.currentJobHandle.Complete(); Material material = GetMaterial(decalEntityChunk); int passIndex = GetPassIndex(decalCachedChunk); if (count == 0 || passIndex == -1 || material == null) { return; } if (SystemInfo.supportsInstancing && material.enableInstancing) { DrawInstanced(cmd, decalEntityChunk, decalCachedChunk, decalDrawCallChunk, passIndex); } else { Draw(cmd, decalEntityChunk, decalCachedChunk, decalDrawCallChunk, passIndex); } }