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."); } } } }
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."); } } } }