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);
     }
 }
            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
        private void Paint()
        {
            RaycastHit hit;

            if (!Physics.Raycast(new Ray(transform.position, transform.forward), out hit))
            {
                lastShotResult = "Didn't hit any colliders";
                return;
            }

            var painter = hit.transform.GetComponentInParent <PlaytimePainter>();

            if (!painter)
            {
                lastShotResult = "No painter detected on {0}".F(hit.transform.name);
                return;
            }

            if (painter.skinnedMeshRenderer && !brush.IsA3DBrush(painter))
            {
                painter.UpdateMeshCollider();

                var colliderDisabled = !painter.meshCollider.enabled;

                if (colliderDisabled)
                {
                    painter.meshCollider.enabled = true;
                }

                if (!painter.meshCollider.Raycast(new Ray(transform.position, transform.forward), out hit, 99999))
                {
                    lastShotResult = "Missed updated Collider";

                    if (colliderDisabled)
                    {
                        painter.meshCollider.enabled = false;
                    }

                    return;
                }

                if (colliderDisabled)
                {
                    painter.meshCollider.enabled = false;
                }

                lastShotResult = "Updated Collider for skinned mesh and Painted";
            }
            else
            {
                lastShotResult = "Painted on Object";
            }

            var v = new StrokeVector(hit, false);

            brush.Paint(v, painter.SetTexTarget(brush));
        }
        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
        private void Paint()
        {
            RaycastHit hit;

            for (var i = 0; i < shoots; i++)
            {
                if (Physics.Raycast(new Ray(transform.position, transform.forward + transform.right * Random.Range(-spread, spread) + transform.up * Random.Range(-spread, spread)), out hit))
                {
                    var receivers = hit.transform.GetComponentsInParent <PaintingReceiver>();

                    if (receivers.Length == 0)
                    {
                        continue;
                    }

                    int subMesh;
                    var receiver = receivers[0];

                    // IF FEW SubMeshes
                    if (hit.collider.GetType() == typeof(MeshCollider))
                    {
                        subMesh = ((MeshCollider)hit.collider).sharedMesh.GetSubMeshNumber(hit.triangleIndex);

                        if (receivers.Length > 1)
                        {
                            var mats = receiver.Renderer.materials;

                            var material = mats[subMesh % mats.Length];

                            receiver = receivers.FirstOrDefault(r => r.Material == material);
                        }
                    }
                    else
                    {
                        subMesh = receiver.materialIndex;
                    }

                    // ACTUAL PAINTING

                    if (!receiver)
                    {
                        continue;
                    }

                    var tex = receiver.GetTexture();

                    if (!tex)
                    {
                        continue;
                    }

                    var rendTex = (receiver.texture.GetType() == typeof(RenderTexture)) ? (RenderTexture)receiver.texture : null;

                    // WORLD SPACE BRUSH

                    if (rendTex)
                    {
                        var st = new StrokeVector(hit.point)
                        {
                            unRepeatedUv = hit.collider.GetType() == typeof(MeshCollider) ?
                                           (receiver.useTexcoord2 ? hit.textureCoord2 : hit.textureCoord).Floor() : receiver.meshUvOffset,
                        };

                        switch (receiver.type)
                        {
                        case PaintingReceiver.RendererType.Skinned when receiver.skinnedMeshRenderer:
                            BrushTypes.Sphere.Paint(rendTex, receiver.gameObject, receiver.skinnedMeshRenderer, brush, st, subMesh);
                            break;

                        case PaintingReceiver.RendererType.Regular when receiver.meshFilter:
                        {
                            var mat = receiver.Material;
                            if (mat && mat.IsAtlased())
                            {
                                BrushTypes.Sphere.PaintAtlased(rendTex, receiver.gameObject,
                                                               receiver.originalMesh ? receiver.originalMesh : receiver.meshFilter.sharedMesh, brush, st, new List <int> {
                                        subMesh
                                    }, (int)mat.GetFloat(PainterDataAndConfig.ATLASED_TEXTURES));
                            }
                            else
                            {
                                BrushTypes.Sphere.Paint(rendTex, receiver.gameObject,
                                                        receiver.originalMesh ? receiver.originalMesh :
                                                        receiver.meshFilter.sharedMesh, brush, st,
                                                        new List <int> {
                                        subMesh
                                    });
                            }
                            break;
                        }
                        }
                    }
                    // TEXTURE SPACE BRUSH
                    else if (receiver.texture is Texture2D)
                    {
                        if (hit.collider.GetType() != typeof(MeshCollider))
                        {
                            Debug.Log("Can't get UV coordinates from a Non-Mesh Collider");
                        }

                        BlitFunctions.Paint(receiver.useTexcoord2 ? hit.textureCoord2 : hit.textureCoord, 1, (Texture2D)receiver.texture, Vector2.zero, Vector2.one, brush, null);
                        var id = receiver.texture.GetTextureData();
                        _texturesNeedUpdate.AddIfNew(id);
                    }
                    else
                    {
                        Debug.Log(receiver.gameObject.name + " doesn't have any combination of paintable things setup on his PainterReciver.");
                    }
                }
            }
        }
            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);
        }
示例#8
0
 public PaintingCollision(PlaytimePainter p)
 {
     painter = p;
     vector  = new StrokeVector();
 }
示例#9
0
 public virtual void AfterGpuStroke(BrushConfig br, StrokeVector st, BrushTypes.Base type)
 {
 }
示例#10
0
 public void PaintRenderTexture(StrokeVector stroke, TextureMeta image, BrushConfig bc,
                                PlaytimePainter painter)
 {
 }
示例#11
0
 public void PaintPixelsInRam(StrokeVector stroke, float brushAlpha, TextureMeta image, BrushConfig bc,
                              PlaytimePainter painter) =>
 painter.GetModule <TileableAtlasingComponentModule>()
 ?.PaintTexture2D(stroke, brushAlpha, image, bc, painter);