示例#1
0
        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);
            }
        }
示例#2
0
        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);
                }
            }
        }