예제 #1
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.");
                    }
                }
            }
        }
예제 #2
0
        private void Paint()
        {
            RaycastHit hit;

            for (var i = 0; i < (continious ? 1 : shoots); i++)
            {
                if (Physics.Raycast(new Ray(transform.position, transform.forward +
                                            (continious ? Vector3.zero :
                                             (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];

                    #region Multiple 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;
                    }

                    #endregion



                    if (!receiver)
                    {
                        continue;
                    }

                    var tex = receiver.GetTexture();

                    if (!tex)
                    {
                        continue;
                    }

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

                    #region  WORLD SPACE BRUSH

                    if (continious)
                    {
                        if (previousTargetForContinious && (receiver != previousTargetForContinious))
                        {
                            continiousStroke.OnMouseUnPressed();
                        }

                        previousTargetForContinious = receiver;
                    }

                    if (rendTex)
                    {
                        var st = continious ? continiousStroke :
                                 new StrokeVector(hit, receiver.useTexcoord2);

                        st.unRepeatedUv = hit.collider.GetType() == typeof(MeshCollider)
                            ? (receiver.useTexcoord2 ? hit.textureCoord2 : hit.textureCoord).Floor()
                            : receiver.meshUvOffset;

                        if (continious)
                        {
                            st.OnMousePressed(hit, receiver.useTexcoord2);
                        }



                        if (receiver.type == PaintingReceiver.RendererType.Skinned && receiver.skinnedMeshRenderer)
                        {
                            BrushTypes.Sphere.Paint(rendTex, receiver.gameObject, receiver.skinnedMeshRenderer, brush, st, subMesh);
                        }
                        else if (receiver.type == PaintingReceiver.RendererType.Regular && receiver.meshFilter)
                        {
                            if (brush.GetBrushType(false) == BrushTypes.Sphere.Inst)
                            {
                                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(PainterShaderVariables.ATLASED_TEXTURES));
                                }
                                else
                                {
                                    BrushTypes.Sphere.Paint(rendTex, receiver.gameObject,
                                                            receiver.originalMesh
                                            ? receiver.originalMesh
                                            : receiver.meshFilter.sharedMesh, brush, st,
                                                            new List <int> {
                                        subMesh
                                    });
                                }
                            }
                            else
                            {
                                BrushTypes.Normal.Paint(rendTex, brush, st);
                            }

                            break;
                        }
                    }
                    #endregion
                    #region 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.GetTextureMeta();
                        _texturesNeedUpdate.AddIfNew(id);
                    }
                    #endregion
                    else
                    {
                        Debug.Log(receiver.gameObject.name + " doesn't have any combination of paintable things setup on his PainterReciver.");
                    }
                }
            }
        }