private void ExecuteCommands(List <P3dCommand> commands, bool sendNotifications, ref RenderTexture main, ref RenderTexture swap, ref Mesh preparedMesh, ref Matrix4x4 preparedMatrix) { RenderTexture.active = main; for (var i = 0; i < commands.Count; i++) { var command = commands[i]; RenderTexture.active = swap; command.Apply(main); if (command.RequireMesh == true) { paintable.GetPrepared(ref preparedMesh, ref preparedMatrix); P3dHelper.Draw(command.Material, preparedMesh, preparedMatrix, slot.Index, coord); } else { P3dHelper.Draw(command.Material); } P3dHelper.Swap(ref main, ref swap); command.Pool(); } commands.Clear(); if (main.useMipMap == true) { main.GenerateMips(); } if (sendNotifications == true) { NotifyOnModified(commands == previewCommands); } }
public void ExecuteCommands(P3dPaintable paintable) { if (activated == true) { var commandCount = commands.Count; var swap = default(RenderTexture); var swapSet = false; // Revert snapshot if (previewSet == true) { P3dHelper.ReleaseRenderTexture(preview); previewSet = false; } if (commandCount > 0) { var oldActive = RenderTexture.active; var prepared = false; var preparedMesh = default(Mesh); var preparedMatrix = default(Matrix4x4); RenderTexture.active = current; for (var i = 0; i < commandCount; i++) { var command = commands[i]; var commandMaterial = command.Material; if (command.Preview != previewSet) { NotifyOnModified(previewSet); if (previewSet == true) { P3dHelper.ReleaseRenderTexture(preview); previewSet = false; RenderTexture.active = current; } else { preview = P3dHelper.GetRenderTexture(current.width, current.height, current.depth, current.format); previewSet = true; P3dHelper.Blit(preview, current); RenderTexture.active = preview; } } if (command.RequireSwap == true) { if (swapSet == false) { swap = P3dHelper.GetRenderTexture(current.width, current.height, current.depth, current.format); swapSet = true; } RenderTexture.active = swap; if (previewSet == true) { swap = preview; preview = RenderTexture.active; } else { swap = current; current = RenderTexture.active; } command.Material.SetTexture(P3dShader._Buffer, swap); } command.Apply(); if (command.RequireMesh == true) { if (prepared == false) { prepared = true; paintable.GetPrepared(ref preparedMesh, ref preparedMatrix); } switch (channel) { case P3dChannel.UV: commandMaterial.SetVector(P3dShader._Channel, new Vector4(1.0f, 0.0f, 0.0f, 0.0f)); break; case P3dChannel.UV2: commandMaterial.SetVector(P3dShader._Channel, new Vector4(0.0f, 1.0f, 0.0f, 0.0f)); break; case P3dChannel.UV3: commandMaterial.SetVector(P3dShader._Channel, new Vector4(0.0f, 0.0f, 1.0f, 0.0f)); break; case P3dChannel.UV4: commandMaterial.SetVector(P3dShader._Channel, new Vector4(0.0f, 0.0f, 0.0f, 1.0f)); break; } commandMaterial.SetPass(0); Graphics.DrawMeshNow(preparedMesh, preparedMatrix, slot.Index); } else { Graphics.Blit(default(Texture), current, commandMaterial); } command.Pool(); } RenderTexture.active = oldActive; commands.Clear(); } if (swapSet == true) { P3dHelper.ReleaseRenderTexture(swap); swapSet = false; } if (commandCount > 0) { NotifyOnModified(previewSet); } if (materialSet == false) { UpdateMaterial(); } if (previewSet == true) { material.SetTexture(slot.Name, preview); } else { material.SetTexture(slot.Name, current); } } }