public override void AfterGpuStroke(BrushConfig br, StrokeVector st, BrushTypes.Base type)
 {
     if (br.IsA3DBrush(painter) && painter.IsAtlased())
     {
         PainterShaderVariables.BRUSH_ATLAS_SECTION_AND_ROWS.GlobalValue = new Vector4(0, 0, 1, 0);
     }
 }
예제 #2
0
            public void PaintRenderTexture(StrokeVector stroke, TextureMeta image, BrushConfig bc,
                                           PlaytimePainter painter)
            {
                var vt = painter.GetVolumeTexture();

                if (!vt)
                {
                    Debug.LogError("Painted volume was not found");
                    return;
                }

                if (_enableRayTracing)
                {
                    rayTraceCameraConfiguration.From(stroke);

                    bc.useAlphaBuffer = false;

                    delayedPaintingConfiguration = new BrushStrokePainterImage(stroke, image, bc, painter);

                    PainterCamera.GetProjectorCamera().RenderRightNow(this);
                }
                else
                {
                    PaintRenderTexture(new BrushStrokePainterImage(stroke, image, bc, painter));
                }
            }
예제 #3
0
 public bool IsA3DBrush(PlaytimePainter painter, BrushConfig bc, ref bool overrideOther)
 {
     if (!painter.GetVolumeTexture())
     {
         return(false);
     }
     overrideOther = true;
     return(true);
 }
        public override void BeforeGpuStroke(BrushConfig br, StrokeVector st, BrushTypes.Base type)
        {
            if (!br.IsA3DBrush(painter) || !painter.IsAtlased())
            {
                return;
            }

            var ats = GetAtlasedSection();

            PainterShaderVariables.BRUSH_ATLAS_SECTION_AND_ROWS.GlobalValue = new Vector4(ats.x, ats.y, atlasRows, 1);
        }
예제 #5
0
 public override bool MouseEventPointedTriangle()
 {
     if ((EditorInputManager.GetMouseButton(0)))
     {
         if (PointedTriangle.SameAsLastFrame)
         {
             return(true);
         }
         BrushConfig bcf = Cfg.brushConfig;
         foreach (var uv in PointedTriangle.vertexes)
         {
             //bcf.colorLinear.ToV4(ref uv.meshPoint.shadowBake, bcf.mask);
             bcf.mask.SetValuesOn(ref uv.meshPoint.shadowBake, bcf.Color);
         }
         EditedMesh.Dirty = true;
         return(true);
     }
     return(false);
 }
예제 #6
0
            public bool BrushConfigPEGI(ref bool overrideBlitMode, BrushConfig br)
            {
                var changed = false;

                var p = InspectedPainter;

                var volTex = p.GetVolumeTexture();

                if (volTex)
                {
                    var tex = volTex.texture;

                    if (tex)
                    {
                        "Volume is a {0} texture".F(tex.IsColorTexture() ? "Color" : "Non-Color Data").write();

#if UNITY_EDITOR
                        if (tex.IsColorTexture())
                        {
                            pegi.nl();
                            var imp = tex.GetTextureImporter();

                            if ((imp != null) && "FIX texture".Click() && (imp.WasWrongIsColor(false)))
                            {
                                imp.SaveAndReimport();
                            }
                        }
#endif


                        pegi.nl();
                    }
                    else
                    {
                        "Volume has no texture".writeWarning();
                    }

                    overrideBlitMode = true;

                    var id = p.TexMeta;

                    var cpuBlit = id.TargetIsTexture2D().nl();

                    br.showingSize = !_enableRayTracing || cpuBlit;

                    if (!cpuBlit)
                    {
                        if (BrushConfig.showAdvanced || _enableRayTracing)
                        {
                            "Ray-Tracing".toggleIcon(ref _enableRayTracing, true).changes(ref changed);

                            if (br.useAlphaBuffer)
                            {
                                icon.Warning.write(
                                    "Ray Tracing doesn't use Alpha buffer. Alpha buffer will be automatically disabled");
                            }
                        }

                        if ("Ray Trace Camera".conditional_enter(
                                _enableRayTracing && PainterCamera.depthProjectorCamera,
                                ref _exploreRayTaceCamera).nl_ifFoldedOut())
                        {
                            "Min".edit(40, ref minFov, 60, maxFov - 1).nl(ref changed);

                            "Max".edit(40, ref maxFov, minFov + 1, 170).nl(ref changed);

                            rayTraceCameraConfiguration.Nested_Inspect().nl(ref changed);
                        }

                        if (smoothing > 0 || BrushConfig.showAdvanced)
                        {
                            pegi.nl();
                            "Smoothing".edit(70, ref smoothing, 0, 1).changes(ref changed);
                            "Best used in the end".fullWindowDocumentationClickOpen();

                            pegi.nl();
                        }

                        if (!_exploreRayTaceCamera && _enableRayTracing)
                        {
                            var dp = PainterCamera.depthProjectorCamera;

                            if (!dp)
                            {
                                if ("Create Projector Camera".Click().nl())
                                {
                                    PainterCamera.GetProjectorCamera();
                                }
                            }
                            else if (dp.pauseAutoUpdates)
                            {
                                pegi.nl();
                                "Light Projectors paused".toggleIcon(ref dp.pauseAutoUpdates).nl(ref changed);
                            }

                            pegi.nl();
                        }
                    }

                    if (!cpuBlit)
                    {
                        pegi.nl();

                        if (!br.GetBrushType(false).IsAWorldSpaceBrush)
                        {
                            "Only World space brush can edit volumes".writeHint();
                            pegi.nl();
                            if ("Change to Sphere brush".Click())
                            {
                                br.SetBrushType(false, BrushTypes.Sphere.Inst);
                            }
                        }
                    }

                    pegi.nl();


                    if (!_exploreRayTaceCamera && PainterCamera.Data.showVolumeDetailsInPainter &&
                        (volTex.name + " " + VolumeEditingExtensions.VolumeSize(id.texture2D, volTex.hSlices))
                        .foldout(ref _exploreVolumeData).nl())
                    {
                        volTex.Nested_Inspect().changes(ref changed);

                        if (volTex.NeedsToManageMaterials)
                        {
                            var painterMaterial = InspectedPainter.Material;
                            if (painterMaterial)
                            {
                                if (!volTex.materials.Contains(painterMaterial))
                                {
                                    if ("Add This Material".Click().nl())
                                    {
                                        volTex.AddIfNew(p);
                                    }
                                }
                            }
                        }
                    }

                    if (!cpuBlit)
                    {
                        MsgPainter.Hardness.GetText()
                        .edit(MsgPainter.Hardness.GetDescription(), 70, ref br.hardness, 1f, 5f).nl(ref changed);
                    }

                    var tmpSpeed = br._dSpeed.Value;
                    if (MsgPainter.Speed.GetText().edit(40, ref tmpSpeed, 0.01f, 4.5f).nl(ref changed))
                    {
                        br._dSpeed.Value = tmpSpeed;
                    }

                    if (br.showingSize)
                    {
                        var maxScale = volTex.size * volTex.Width * 4;

                        "Scale:".edit(40, ref br.brush3DRadius, 0.001f * maxScale, maxScale * 0.5f)
                        .changes(ref changed);

                        if (cpuBlit && !_brushShaderFroRayTrace && br.brush3DRadius > BrushScaleMaxForCpu(volTex))
                        {
                            icon.Warning.write(
                                "Size will be reduced when panting due to low performance of the CPU brush for volumes");
                        }
                    }

                    pegi.nl();
                }

                return(changed);
            }
예제 #7
0
 public bool IsEnabledFor(PlaytimePainter painter, TextureMeta img, BrushConfig cfg) =>
 img.GetVolumeTextureController();
예제 #8
0
            public void PaintPixelsInRam(StrokeVector stroke, float brushAlpha, TextureMeta image, BrushConfig bc,
                                         PlaytimePainter painter)
            {
                var volume = image.texture2D.GetVolumeTextureData();

                if (!volume)
                {
                    return;
                }

                bc.brush3DRadius = Mathf.Min(BrushScaleMaxForCpu(volume), bc.brush3DRadius);

                var volumeScale = volume.size;

                var pos = (stroke.posFrom - volume.transform.position) / volumeScale + 0.5f * Vector3.one;

                var height   = volume.Height;
                var texWidth = image.width;

                BlitFunctions.brAlpha = brushAlpha;
                bc.PrepareCpuBlit(image);
                BlitFunctions.half = bc.Size(true) / volumeScale;

                var pixels = image.Pixels;

                var iHalf  = (int)(BlitFunctions.half - 0.5f);
                var smooth = bc.GetBrushType(true) != BrushTypes.Pixel.Inst;

                if (smooth)
                {
                    iHalf += 1;
                }

                BlitFunctions.alphaMode = BlitFunctions.SphereAlpha;

                var sliceWidth = texWidth / volume.hSlices;

                var hw = sliceWidth / 2;

                var y = (int)pos.y;
                var z = (int)(pos.z + hw);
                var x = (int)(pos.x + hw);

                for (BlitFunctions.y = -iHalf; BlitFunctions.y < iHalf + 1; BlitFunctions.y++)
                {
                    var h = y + BlitFunctions.y;

                    if (h >= height)
                    {
                        return;
                    }

                    if (h < 0)
                    {
                        continue;
                    }
                    var hy        = h / volume.hSlices;
                    var hx        = h % volume.hSlices;
                    var hTexIndex = (hy * texWidth + hx) * sliceWidth;

                    for (BlitFunctions.z = -iHalf; BlitFunctions.z < iHalf + 1; BlitFunctions.z++)
                    {
                        var trueZ = z + BlitFunctions.z;

                        if (trueZ < 0 || trueZ >= sliceWidth)
                        {
                            continue;
                        }
                        var yTexIndex = hTexIndex + trueZ * texWidth;

                        for (BlitFunctions.x = -iHalf; BlitFunctions.x < iHalf + 1; BlitFunctions.x++)
                        {
                            if (!BlitFunctions.alphaMode())
                            {
                                continue;
                            }
                            var trueX = x + BlitFunctions.x;

                            if (trueX < 0 || trueX >= sliceWidth)
                            {
                                continue;
                            }
                            var texIndex = yTexIndex + trueX;
                            BlitFunctions.blitMode(ref pixels[texIndex]);
                        }
                    }
                }
            }
        public bool PaintTexture2D(StrokeVector stroke, float brushAlpha, TextureMeta image, BrushConfig bc, PlaytimePainter painter)
        {
            if (!painter.IsAtlased())
            {
                return(false);
            }

            var uvCoords = stroke.uvFrom;

            var atlasedSection = GetAtlasedSection();

            sectorSize = image.width / atlasRows;
            atlasSector.From(atlasedSection * sectorSize);

            BlitFunctions.brAlpha = brushAlpha;

            BlitFunctions.half = (bc.Size(false)) / 2;
            var iHalf = Mathf.FloorToInt(BlitFunctions.half - 0.5f);

            var smooth = bc.GetBrushType(true) != BrushTypes.Pixel.Inst;

            if (smooth)
            {
                BlitFunctions.alphaMode = BlitFunctions.CircleAlpha;
            }
            else
            {
                BlitFunctions.alphaMode = BlitFunctions.NoAlpha;
            }

            BlitFunctions.blitMode = bc.GetBlitMode(true).BlitFunctionTex2D(image);

            if (smooth)
            {
                iHalf += 1;
            }

            BlitFunctions.alpha = 1;


            BlitFunctions.Set(bc.mask);

            BlitFunctions.cSrc = bc.Color;

            var tmp = image.UvToPixelNumber(uvCoords);

            var fromX = tmp.x - iHalf;

            tmp.y -= iHalf;

            var pixels = image.Pixels;

            for (BlitFunctions.y = -iHalf; BlitFunctions.y < iHalf + 1; BlitFunctions.y++)
            {
                tmp.x = fromX;

                for (BlitFunctions.x = -iHalf; BlitFunctions.x < iHalf + 1; BlitFunctions.x++)
                {
                    if (BlitFunctions.alphaMode())
                    {
                        var sx = tmp.x - atlasSector.x;
                        var sy = tmp.y - atlasSector.y;

                        sx %= sectorSize;
                        if (sx < 0)
                        {
                            sx += sectorSize;
                        }
                        sy %= sectorSize;
                        if (sy < 0)
                        {
                            sy += sectorSize;
                        }

                        BlitFunctions.blitMode(ref pixels[((atlasSector.y + sy)) * image.width + (atlasSector.x + sx)]);
                    }

                    tmp.x += 1;
                }

                tmp.y += 1;
            }
            return(true);
        }
예제 #10
0
 public virtual void AfterGpuStroke(BrushConfig br, StrokeVector st, BrushTypes.Base type)
 {
 }
예제 #11
0
 public bool IsEnabledFor(PlaytimePainter painter, TextureMeta id, BrushConfig cfg) =>
 painter.IsAtlased() && !id.TargetIsRenderTexture();
예제 #12
0
 public bool BrushConfigPEGI(ref bool overrideBlitMode, BrushConfig br) => false;
예제 #13
0
 public void PaintRenderTexture(StrokeVector stroke, TextureMeta image, BrushConfig bc,
                                PlaytimePainter painter)
 {
 }
예제 #14
0
 public bool IsA3DBrush(PlaytimePainter painter, BrushConfig bc, ref bool overrideOther) => false;
예제 #15
0
 public void PaintPixelsInRam(StrokeVector stroke, float brushAlpha, TextureMeta image, BrushConfig bc,
                              PlaytimePainter painter) =>
 painter.GetModule <TileableAtlasingComponentModule>()
 ?.PaintTexture2D(stroke, brushAlpha, image, bc, painter);