If you haven't already, please consider writing a review. They really help me out!
First, make sure you back up your project files.
Next, install the latest version.
If for some reason the latest update breaks your project (e.g. errors in the console), then try deleting the root folder for this asset, and reinstalling it.
If it still doesn't work then let me know what the errors are so I can fix it, and revert your project to the previously backed up version so you can still continue working.
Select your sprite GameObject, and find the SpriteRenderer component in the Inspector tab.
Then, open its context menu (the ⋮ button), and select the Make Paintable (Paint in 2D) option.
This will add the CwPaintableSprite and CwPaintableSpriteTexture components to it.
Make a new GameObject, and add the CwHitScreen2D and CwPaintDecal2D components.
When combined, these components allow you to paint to all paintable sprites in your scene.
Feel free to adjust the CwPaintDecal2D component's settings like Texture, Color, etc.
You can now hit the â–¶ Play button, and enjoy painting your sprite.
You can also make a build for mobile and paint with your fingers.
You can now go through all the tutorial demo scenes in the Plugins/CW/PaintIn2D/Examples folder. These take you step by step through every feature of this asset, and the description text shows you exactly what is being shown.
This is a list of the in-game example scenes and a description of what it shows.
This shows you how to configure a sprite for painting. First, select your Sprite GameObject, and in the inspector open the Sprite Renderer component's context menu (the ⋮ button), and select the \"Make Paintable (Paint in 2D)\" option. Next, add a 2D collider to it, like the PolygonCollider2D. Once done, it should look like the \"Paintable Book\" GameObject in this scene.
This shows you how to paint sprites. First, make a new GameObject, and add the CwHitScreen2D component. This will automatically add the CwPointerMouse, CwPointerTouch, and CwPointerPen components, which add painting support for mouse, touch, and tablet pens. Next, you can add the CwPaintDecal2D component, and set its Texture and Color settings as desired. The \"Paint Texture\" GameObject is an example of what this might look like.
This shows you how the CwPaintDecal2D component's Modifier system can be used to make the painted texture look more interesting. Simply click the \"Add Modifier\" button, and choose what you would like to modify. In this scene the \"Paint Texture\" GameObject has modifiers that randomize the angle, color, and radius of the painted texture.
This shows you how to quickly make a selection of painting tools that can be chosen using the UI. This is done by adding many painting GameObjects to the Tools GameObject. Each tool has the CwDemoButtonBuilder component, and once configured you can press the BuildAll button, where it add buttons to your UI that allows you to choose between them.
This shows you what happens when you try to paint a sprite that's part of an atlas (if you have the Sprite Packer setting enabled). You can see that it works, but the painting resolution is reduced. This is because a texture atlas is usually high resolution, but the painting resolution is usually lower. While you can adjust the CwPaintableSpriteTexture component's Size setting to account for this - It's recommend that you remove your paintable sprites from atlases. This is because each paintable sprite has its own unique paint state, so they're not batched together, and therefore you get no benefit from putting these specific paintable sprites in an atlas.
This shows you how high resolution painting can still be achieved with texture atlases. This is done by adding a secondary sprite on top of your atlas which is configured for painting. This allows the underlying sprite to be high resolution and part of an atlas, and the actual overlay paint sprite to be entirely separate and at a different resolution. Keep in mind the overlay sprite must not be in an atlas. Also keep in mind you must set the CwPaintableSpriteTexture.Color setting to be transparent (0 alpha/opacity). Also keep in mind you must adjust the sprite's Additional Settings / OrderInLayer or Z position so it renders on top of the base sprite.
This shows you how the CwPaintableSpriteTexture component's Advanced/LocalMask setting can be used to restrict painting to specific areas of your sprite. Keep in mind the mask texture must be the same size as the base sprite.
This shows you how the CwChangeCounter component can be used to count how many pixels of a sprite are different relative to the original sprite. This is shown in the UI using the CwChangeCounterFill and CwChangeCounterText and CwChangeCounterEvent components.
This shows you how the CwColorCounter component can be used to count how many pixels of a sprite match specific colors. Each color is defined using the CwColor component, which you can see are children of the Colors GameObject. The color counts are shown in the UI using the CwColorCounterFill and CwColorCounterText and CwColorCounterEvent components.
This shows you how the CwHitCollisions2D and CwPaintDecal2D components can be used to apply paint at the contact point between the current sprite and another.
This shows you how multiple CwHitCollisions2D components can be used at the same time. This is done by placing the CwPaintDecal2D components in child GameObject, and dragging and dropping them into the CwHitCollisions2D component's Advanced/Root setting. You can also disable the OnlyUseFirstContact setting to make it continuously apply paint as it collides.
This shows you how the CwPaintableSpriteTexture component's UndoRedo setting can be enabled. You can then make UI images with the CwButtonUndoAll and CwButtonRedoAll component to turn them into buttons.
This shows you how paint can be reset by adding the CwButtonClearAll component to your UI images to turn them into buttons.
This shows you how paint can be automatically saved and loaded by setting the CwPaintableSpriteTexture component's SaveLoad setting to Automatic, and setting a name for this sprite's save data. The sprite's paint will then be automatically saved/loaded when you start/stop the scene or run the app.
This shows you how to paint decals like stickers. This is done by changing the CwHitScreen2D component's Frequency setting can be set to Once On Release, and enabling the CwPointerMouse component's Preview setting.
This shows you how the CwPaintDecal2D component's Advanced / TileTexture setting can be used to paint a seamless texture with the decal shape. The TileTransform setting can also be used to control the tiling and rotation of the tiled texture.
This shows you how the CwHitScreen2D component's Frequency setting can be set to PixelInterval or ScaledPixelInterval (DPI independent). This then allows you to set the Interval setting, which allows you to draw a dotted line as your mouse/finger drags across the screen.
This shows you how instead of the CwHitScreen2D component, the CwHitScreenLine2D can be used. This allows you to draw lines between the start and end positions of a finger swipe. This component's Frequency setting can be used to control how many points are in the line relative to its length. This component's Advanced/ConnectHits and Advanced/ClipConnected settings can be enabled to make a solid line.
This shows you how a sprite's texture can be erased/restored to its original state. To erase it, the paint tool's CwPaintDecal2D component's BlendMode setting can be set to ReplaceOriginal. This will paint the sprite back to its original state.
This shows you how a sprite's alpha can be erased and restored. To erase it, the paint tool's CwPaintDecal2D component's BlendMode setting can be set to Subtractive, with a Channels setting of 0,0,0,1, so it only subtracts the alpha/opacity. To restore it, the ReplaceOriginal blending mode can be used, with the same 0,0,0,1 Channels setting.
This shows you how to initialize a sprite as transparent, and then paint the alpha back to restore it. This is done by changing the paintable sprite texture component's Color setting to have 0 alpha/opacity. This means when activated, the sprite will become invisible. The alpha can then be restored with your painting tool's CwPaintDecal2D component's BlendMode setting set to ReplaceOriginal, and the Channels set to 0,0,0,1, so it only replaces the alpha.
This shows you how the CwMaskSprite component can be added to a sprite, causing it to block all paint that hits the solid parts. Keep in mind only the closest mask will be used when painting. Keep in mind the CwDragToMove component used in this scene requires there to be a collider on your sprite.
This shows you how the CwCloneMirror component can be added to the scene, and it will cause all paint to be mirrored across the axis you can see in the Scene view. Keep in mind you must rotate it Y = 90 degrees initially. You can then adjust the X rotation.
This shows you how the CwCloneMirror component's Flip setting can be enabled. This is useful if you want to mirror text, and other sprites that require the original orientation to be retained.
This shows you how the CwTapToReadColor component can be added to a sprite, allowing you to read its colors, and sending that color out via event. Keep in mind your sprite must have a 2D collider, and your camera must have the Physics2DRaycaster component. Keep in mind your sprite must have its Advanced/ReadWrite setting enabled, must have its Compression setting disabled, and it must not be in an atlas.
This shows you how a particle system can be made to paint sprites on collision. First, on the particle system you must set Collision = true, then you must set Mode = 2D, and then you must set SendCollisionMessages = true. You can then add the CwHitParticles2D and CwPaintDecal2D components alongside, which will then paint the scene each time a particle hits something.
This shows you how the CwHitNearby and CwPaintDecal2D components can be combined to emit paint from a GameObject. If the CwHitNearby component's PaintIn is set to Update, then it will continuously paint. You can see a preview of what the paint shape looks like in the Scene tab.
This shows you how to make a sprite paint a decal when you tap on it. This is done using the CwHitNearby and CwPaintDecal2D components, and setting the CwHitNearby component's PaintIn setting to ManuallyOnly. You can then add the CwTapEvent, and connect its event to the CwHitNearby component's ManuallyHitNow event, which will trigger it to paint each time you tap. Keep in mind the CwTapEvent and CwDragToMove components used in this scene require there to be a collider on your sprite.
This shows you how the CwPaintDecal2D component's BlendMode can be set to Blur. This causes all painted pixel to blur with their surrounding pixels. The Kernel setting can be used to control the range of the blur.
This shows you how the CwPaintDecal2D component's BlendMode can be set to Flow. This allows you to set a tangent-space normal map texture in the Texture setting, which causes the painted pixels to flow in specific directions to create interesting effects.
This shows you how to create a clone stamp effect. This is done by adding an orthographic camera to your scene, and setting its TargetTexture to a RenderTexture asset in your project. The camera will then update the texture with what it sees in the scene, and you can drag and drop this texture into your CwPaintDecal2D component's Texture, which allows you to then paint it on your sprites.
This shows you how the CwGraduallyFade component can be used to slowly fade a sprite back to its original state, erasing all paint.
This shows you how to make paint gradually appear. This is done by creating two CwPaintableSpriteTexture components - one for the future, and one for the present. The future one is what is painted, and its Advanced/IsDummy setting must be enabled, so it doesn't get applied to your sprite. Your current texture must have its Group set to DUMMY, so that it doesn't get painted. The CwGraduallyFade component is then used to fade the current texture to the future one using BlendMode = Replace, and the future texture set in the BlendPaintableTexture setting.
This shows you how to make paint that expands over time. This is done using the CwHitScreen2D and CwSpawner components, which will spawn a prefab under the mouse/finger when you click/tap the screen. The spawned prefab has the CwHitNearby and CwPaintDecal2D components, which make the spawned prefab paint continuously. The prefab also has the CwPaintAction component, which is used to call the CwPaintDecal.MultiplyRadius and CwPaintDecal.IncrementRadius functions to animate the paint size. Finally, the CwDestroyAfterTime component is used to destroy the prefab after 2 seconds.
Here's a list of all my other assets, please check them out!
You can also view this list on my Asset Store page.
Rapidly develop your game with consistent input across desktop & mobile using Lean Touch. This lightweight asset comes with many modular components, allowing you to customize them to your exact project needs!
Lean Touch+ is an extension to the popular Lean Touch asset, adding many more example scenes.
Lean Localization is a localization library that's designed to be as simple to use as possible for both designers, and programmers.
Quickly optimize the performance of your games using Lean Pool. Within minutes you can use this lightweight asset to preload, recycle, and limit the spawning of your prefabs.
Quickly polish your games using Lean Transition. This asset allows you to easily tween or animate almost anything in your game, making it transition smoothly.
Lean GUI is a colllection of components that extend Unity's GUI system, allowing you to rapidly enhance the user experience (UX) of your game's UI.
Lean GUI Shapes allows you to quickly add lines, rounded boxes, polygons, and much more to your GUI!
Lean Texture allows you quickly modify textures in your project with a range of filters, pack them together into channels, and much more!
Lean Texture+ is an extension to Lean Texture, adding many new types of texture modification tools!
Unlock a universe of visual possibilities with Modular Backgrounds. Simply drag and drop these graphics into the background of your scenes.
Paint all your objects using Paint in 3D - both in game, and in editor. All features are optimized with GPU accelerated texture painting, so you can enjoy consistent performance, even if you paint your objects one million times!
Paint all your sprites with Paint in 2D. With incredible performance on mobile, WebGL, and much more!
Paint in Editor unlocks the ability to paint objects in your scene - great for making small tweaks, or even creating entirely new texture sets!
FLOW allows you to add large scale interactive fluids to your scene - all highly optimized using GPU acceleration.
Unlock the full potential of your 2D games using Destructible 2D, this asset allows you to quickly convert all your boring solid sprites into fully destructible ones!
Quickly make the space scene of your dreams using Space Graphics Toolkit. This huge collection of space effects can be customized and combined in any way you like, allowing you to quickly make realistic or fantasy worlds. Each feature has been heavily optimized to run on almost any device and platform.
Enhance your space scenes using this large pack of high detail volumetric planets. These planets are finished using the powerful planet features from Space Graphics Toolkit (not required).
Unity sounds only emanate from a single point source. This is great for explosions and footsteps, but quite often you need something more advanced. Volumetric Audio is an easy to use package that allows you to define boxes, spheres, capsules, paths, or meshes that sounds can emanate from.
Added HasRead property to all Cw___Counter components.
Fixed Cw___CounterEvent components firing on the first frame before the counters have updated.
Added CwPaintDecal2D.MultiplyOpacity method.
Added CwPaintDecal2D.IncrementRadius method.
Added CwPaintDecal2D.IncrementScale method.
Added Advanced/Intercept setting to CwHitScreen2D.
Added Advanced/AutoStoreState setting to CwPaintableMeshTexture component.
Undo/Redo states are now only created if you actually paint something (when a hit command is sent to a texture).
This component invokes the Action event when this component is enabled.
The event that will be invoked.
This defines the blending mode used by a painting operation.
This is the index of the currently selected blending mode.
When using the ReplaceCustom blending mode, this allows you to specify the replacement color.
When using the ReplaceCustom blending mode, this allows you to specify the replacement texture.
When using the Blur or Flow blending modes, this allows you to set the maximum pixel distance of samples.
This allows you to control which channels will be modified by this blending mode.
1,1,1,1 = All channels will be modified.
1,0,0,0 = Only red will be modified.
This component allows you to perform the Clear action. This can be done by attaching it to a clickable object, or manually from the ClearAll method.
When clearing a texture, should its undo states be cleared too?
This component allows you to perform the Redo All action. This can be done by attaching it to a clickable object, or manually from the RedoAll method.
If you want to manually trigger RedoAll, then call this function.
This component allows you to perform the Undo All action. This can be done by attaching it to a clickable object, or manually from the RedoAll method.
If you want to manually trigger UndoAll, then call this function.
This component will check all pixels in the specified paintable texture, compare them to the reference state defined in this component, and tell you how many of them differ by more than the threshold value.
This stores all active and enabled instances.
The RGBA values must be within this range of a color for it to be counted.
The texture we want to compare change to.
None/null = white.
The color we want to compare change to.
The previously counted amount of pixels with a RGBA value difference above the threshold.
The Count / Total value.
This will return true once this counter has updated at least once.
The Total of the specified counters.
The Count of the specified counters.
The Ratio of the specified counters.
This component allows you to perform an event when the specified CwChangeCounter instances are painted a specific amount.
This allows you to specify the counters that will be used.
None = All active and enabled counters in the scene.
This paint ratio must be inside this range to be considered inside.
This tells you if the paint ratio is within the current Range.
This event will be called on the first frame Inside becomes true.
This event will be called on the first frame Inside becomes false.
This tells you the current paint ratio of the specified Color, where 0 is no paint, and 1 is fully painted.
This component fills the attached UI Image based on the total amount of pixels that have been painted in the specified CwChangeCounterFill components.
This allows you to specify the counters that will be used.
Zero = All active and enabled counters in the scene.
Inverse the fill?
This component will output the total pixels for the specified team to a UI Text component.
This allows you to specify the counters that will be used.
Zero = All active and enabled counters in the scene.
Inverse the Count and Percent values?
This allows you to set the amount of decimal places when using the percentage output.
This allows you to set the format of the team text. You can use the following tokens:
{TOTAL} = Total amount of pixels that can be painted.
{COUNT} = Total amount of pixel that have been painted.
{PERCENT} = Percentage of pixels that have been painted.
The color count will be output via this event.
This component will total up all RGBA channels in the specified CwPaintableTexture that exceed the threshold value.
This stores all active and enabled instances.
The RGBA value must be higher than this for it to be counted.
The previously counted amount of pixels with a red channel value above the threshold.
The previously counted amount of pixels with a green channel value above the threshold.
The previously counted amount of pixels with a blue channel value above the threshold.
The previously counted amount of pixels with a alpha channel value above the threshold.
The CountR/Total value, allowing you to easily see how much % of the red channel is above the threshold.
The CountG/Total value, allowing you to easily see how much % of the green channel is above the threshold.
The CountB/Total value, allowing you to easily see how much % of the blue channel is above the threshold.
The CountA/Total value, allowing you to easily see how much % of the alpha channel is above the threshold.
The RatioR/G/B/A values packed into a Vector4.
This will return true once this counter has updated at least once.
The Total of the specified counters.
The CountR of the specified counters.
The CountG of the specified counters.
The CountB of the specified counters.
The CountA of the specified counters.
The CountR / Total of the specified counters.
The CountG / Total of the specified counters.
The CountB / Total of the specified counters.
The CountA / Total of the specified counters.
The GetCountR/G/B/A / GetTotal of the specified counters stored in a Vector4.
This component allows you to perform an event when the specified CwChannelCounter instances are painted a specific amount.
This allows you to specify the counters that will be used.
None = All active and enabled counters in the scene.
This allows you to choose which channel will be output to the UI Text.
This paint ratio must be inside this range to be considered inside.
This tells you if the paint ratio is within the current Range.
This event will be called on the first frame Inside becomes true.
This event will be called on the first frame Inside becomes false.
This tells you the current paint ratio of the specified Channel, where 0 is no paint, and 1 is fully painted.
This component fills the attached UI Image based on the total amount of opaque pixels that have been painted in all active and enabled CwChannelCounter components in the scene.
This allows you to specify the counters that will be used.
Zero = All active and enabled counters in the scene.
This allows you to choose which channel will be output to the UI Image.
Inverse the fill?
This component allows you to output the totals of all the specified pixel counters to a UI Text component.
This allows you to specify the counters that will be used.
Zero = All active and enabled counters in the scene.
This allows you to choose which channel will be output to the UI Text.
Inverse the Count and Percent values?
This allows you to set the amount of decimal places when using the percentage output.
This allows you to set the format of the team text. You can use the following tokens:
{TOTAL} = Total amount of pixels that can be painted.
{COUNT} = Total amount of pixel that have been painted.
{PERCENT} = Percentage of pixels that have been painted.
The color count will be output via this event.
This is the base class for all components that repeat paint commands (e.g. mirroring).
This stores all active and enabled instances in the open scenes.
This component grabs paint hits and connected hits, mirrors the data, then re-broadcasts it.
When a decal is mirrored it will appear backwards, should it be flipped back around?
This component allows you to define a color that can later be counted from the CwColorCounter component.
The color associated with this component and GameObject name.
This stores all active and enabled instances in the open scenes.
This tells you how many pixels this color could be painted on.
This tells you how many pixels this color has been painted on.
This is Solid/Total, allowing you to quickly see the percentage of paintable pixels that have been painted by this color.
This component will search the specified paintable texture for pixel colors matching an active and enabled CwColor.
This stores all active and enabled instances.
The RGBA values must be within this range of a color for it to be counted.
Each color contribution will be stored in this list.
This will return true once this counter has updated at least once.
The Total of the specified counters.
The Count of the specified counters.
The Ratio of the specified counters.
This tells you how many pixels of the specified color are in the current PaintableTexture.
This component allows you to perform an event when the specified CwColorCounter instances are painted a specific amount.
This allows you to specify the counters that will be used.
None = All active and enabled counters in the scene.
This allows you to set which color will be handled by this component.
This paint ratio must be inside this range to be considered inside.
This tells you if the paint ratio is within the current Range.
This event will be called on the first frame Inside becomes true.
This event will be called on the first frame Inside becomes false.
This tells you the current paint ratio of the specified Color, where 0 is no paint, and 1 is fully painted.
This component fills the attached UI Image based on the total amount of pixels that have been painted in the specified CwColorCounter components.
This allows you to specify the counters that will be used.
Zero = All active and enabled counters in the scene.
This allows you to set which color will be handled by this component.
Inverse the fill?
This component will output the total pixels for the specified color to the OnString event.
This allows you to specify the counters that will be used.
Zero = All active and enabled counters in the scene.
This allows you to set which color will be handled by this component.
Inverse the Count and Percent values?
This allows you to set the amount of decimal places when using the percentage output.
This allows you to set the format of the team text. You can use the following tokens:
{TOTAL} = Total amount of pixels that can be painted.
{COUNT} = Total amount of pixel that have been painted.
{PERCENT} = Percentage of pixels that have been painted.
The color count will be output via this event.
This is the base class for all paint commands. These commands (e.g. paint decal) are added to the command list for each CwPaintableTexture, and are executed at the end of the frame to optimize state changes.
This is the original array index, used to stable sort between two commands if they have the same priority.
Is this preview painting, or real painting?
The draw order priority of this command for this frame.
The hash of the Material used to apply this paint command.
The material pass that will be used.
The hash of the Model used to apply this paint command.
The mesh submesh that will be painted.
The LocalMask that will be used when painting.
The channel of the LocalMaskTexture that will be used.
This class manages the decal 2D painting command.
This method allows you to set the shape and rotation of the texture.
This class contains some useful methods used by this asset.
This method allows you to save a byte array to PlayerPrefs, and is used by the texture saving system.
If you want to save to files instead then just modify this.
This method allows you to load a byte array from PlayerPrefs, and is used by the texture loading system.
If you want to save to files instead then just modify this.
This method tells if you if there exists save data at the specified save name.
This method allows you to clear save data at the specified save name.
This tool allows you to copy UV1 data into UV0. This is useful if you let Unity automatically generate lightmap UV data for you and you want to use them to paint normally.
The original mesh whose UV seams you want to fix.
The coord that will be copied into the first UV channel of the output mesh.
The coord that will be copied into the second UV channel of the output mesh.
The coord that will be copied into the third UV channel of the output mesh.
The coord that will be copied into the fourth UV channel of the output mesh.
This component automatically destroys this GameObject after some time.
If this component has been active for this many seconds, the current GameObject will be destroyed.
-1 = DestroyNow must be manually called.
This component automatically destroys the specified GameObject when sent a hit point. Hit points will automatically be sent by any CwHit___ component on this GameObject, or its ancestors.
This GameObject will be destroyed.
This component turns the current sprite into one that can be dragged around using the mouse/touch.
This component allows you to fade the pixels of the specified CwPaintableTexture.
This allows you to choose which paintable texture will be modified by this component.
Once this component has accumulated this amount of fade, it will be applied to the PaintableTexture. The lower this value, the smoother the fading will appear, but also the higher the performance cost.
The speed of the fading.
1 = 1 Second.
2 = 0.5 Seconds.
This component will paint using this blending mode.
The texture that will be faded toward.
The paintable texture that will be faded toward.
The color that will be faded toward.
If you want the gradually fade effect to be masked by a texture, then specify it here.
If you want the gradually fade effect to be masked by a paintable texture, then specify it here.
This allows you to specify the channel of the mask.
This object allows you to define information about a paint group like its name, which can then be selected using the CwGroup setting on components like CwPaintableTexture and CwPaintDecal.
This allows you to set the ID of this group (e.g. 100).
This static property returns a list of all cached CwGroupData instances.
This method allows you to get the name of the current group, with an optional prefix of the Index (e.g. "100: Albedo").
This static method calls GetAlias on the CwGroupData with the specified Index setting, or null.
This static method returns the CwGroupData with the specified Index setting, or null.
This static method forces the cached instance list to update.
This struct can be used to reference a Material by instance or hash for de/serialization.
This struct can be used to reference a Material by instance or hash for de/serialization.
This struct can be used to reference a Texture by instance or hash for de/serialization.
This stores information about a scene point on a mesh. This is usually generated from a RaycastHit, but it can also be filled manually.
The world position that was hit.
The world normal that was hit.
The Transform that was hit.
The triangle index that was hit.
The world distance that was hit.
The Collider that was hit.
This component raycasts between two points, and fires hit events when the ray hits something.
Where in the game loop should this component hit?
The time in seconds between each raycast.
0 = Every frame.
-1 = Manual only.
The start point of the raycast.
The end point of the raycast.
The end point of the raycast.
The layers you want the raycast to hit.
How should the hit point be oriented?
WorldUp = It will be rotated to the normal, where the up vector is world up.
CameraUp = It will be rotated to the normal, where the up vector is world up.
ThisRotation = The current Transform.rotation will be used.
ThisLocalRotation = The current Transform.localRotation will be used.
CustomRotation = The specified CustomTransform.rotation will be used.
CustomLocalRotation = The specified CustomTransform.localRotation will be used.
Orient to a specific camera?
None = MainCamera.
If you use Orientation = CustomRotation/CustomLocalRotation, this allows you to set the transform.
Which normal should the hit point rotation be based on?
If you want the raycast hit point to be offset from the surface a bit, this allows you to set by how much in world space.
Should the applied paint be applied as a preview?
This allows you to override the order this paint gets applied to the object during the current frame.
This allows you to control the pressure of the painting. This could be controlled by a VR trigger or similar for more advanced effects.
If you want to display something at the hit point (e.g. particles), you can specify the Transform here.
If you want to draw a line between the start point and the his point then you can set the line here.
This allows you to connect the hit points together to form lines.
This method will immediately submit a non-preview hit. This can be used to apply real paint to your objects.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
If this GameObject has teleported and you have ConnectHits or HitSpacing enabled, then you can call this to prevent a line being drawn between the previous and current points.
This class stores lists of IHit__ instances, allowing components like CwHit__ to easily invoke hit events.
This component can be added to any Rigidbody2D, and it will fire hit events when it hits something.
This allows you to filter collisions to specific layers.
If there are multiple contact points, skip them?
If this component is generating too many hits, then you can use this setting to ignore hits for the specified amount of seconds.
0 = Unlimited.
How should the hit point be oriented?
WorldUp = It will be rotated to the normal, where the up vector is world up.
CameraUp = It will be rotated to the normal, where the up vector is world up.
Orient to a specific camera?
None = MainCamera.
Should the applied paint be applied as a preview?
If the collision impact speed is below this value, then the collision will be ignored.
This allows you to set how the pressure value will be calculated.
Constant = The PressureConstant value will be directly used.
ImpactSpeed = The pressure will be 0 when the collision impact speed is PressureMin, and 1 when the impact speed is or exceeds PressureMax.
The impact strength required for a hit to occur with a pressure of 0.
The impact strength required for a hit to occur with a pressure of 1.
The pressure value used when PressureMode is set to Constant.
The calculated pressure value will be multiplied by this.
If you want the raycast hit point to be offset from the surface a bit, this allows you to set by how much in world space.
This allows you to override the order this paint gets applied to the object during the current frame.
Hit events are normally sent to all components attached to the current GameObject, but this setting allows you to override that. This is useful if you want to use multiple CwHitCollisions2D components with different settings and results.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
This component continuously fires hit events using the current Transform position.
Where in the game loop should this component hit?
The time in seconds between each hit.
0 = Every frame.
Should the applied paint be applied as a preview?
This allows you to override the order this paint gets applied to the object during the current frame.
This allows you to control the pressure of the painting. This could be controlled by a VR trigger or similar for more advanced effects.
This allows you to connect the hit points together to form lines.
This method will immediately submit a non-preview hit. This can be used to apply real paint to your objects.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
If this GameObject has teleported and you have ConnectHits or HitSpacing enabled, then you can call this to prevent a line being drawn between the previous and current points.
This component can be added to any ParticleSystem with collisions enabled, and it will fire hits when the particles collide with something.
This allows you to filter collisions to specific layers.
How should the hit data be rotated?
If you want the raycast hit point to be offset from the surface a bit, this allows you to set by how much in world space.
If you have too many particles, then painting can slow down. This setting allows you to reduce the amount of particles that actually cause hits.
0 = Every particle will hit.
5 = Skip 5 particles, then hit using the 6th.
Should the particles paint preview paint?
This allows you to override the order this paint gets applied to the object during the current frame.
This allows you to set how the pressure value will be calculated.
Constant = The PressureConstant value will be directly used.
Distance = A value will be calculated based on the distance between this emitter and the particle hit point.
Speed = A value will be calculated based on the hit speed of the particle.
This allows you to specify the distance/speed that gives 0.0 pressure.
This allows you to specify the distance/speed that gives 1.0 pressure.
The pressure value used when PressureMode is set to Constant.
The calculated pressure value will be multiplied by this.
Hit events are normally sent to all components attached to the current GameObject, but this setting allows you to override that. This is useful if you want to use multiple CwHitParticles2D components with different settings and results.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
This this is the base class for hit screen components that receive data from CwPointer___ components.
Fingers that began touching the screen on top of these UI layers will be ignored.
This component will perform a raycast under the mouse or finger as it moves across the screen. It will then send hit events to components like CwPaintDecal, allowing you to paint the scene.
This allows you to control how often the screen is painted.
PixelInterval = Once every Interval pixels.
ScaledPixelInterval = Like PixelInterval, but scaled to the screen DPI.
TimeInterval = Once every Interval seconds.
OnceOnRelease = When the finger/mouse goes down a preview will be shown, and when it goes up the paint will apply.
OnceOnPress = When the finger/mouse goes down the paint will apply.
OnceEveryFrame = Every frame the paint will apply.
This allows you to set the pixels/seconds between each hit point based on the current Frequency setting.
This allows you to connect the hit points together to form lines.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
If this GameObject has teleported and you have ConnectHits or HitSpacing enabled, then you can call this to prevent a line being drawn between the previous and current points.
This class contains common code for screen based mouse/finger hit components.
Orient to a specific camera?
None = MainCamera.
The layers you want the raycast to hit.
This allows you to control the hit data this component sends out.
PointsIn3D = Point drawing in 3D.
PointsOnUV = Point drawing on UV (requires non-convex MeshCollider).
TrianglesIn3D = Triangle drawing in 3D (requires non-convex MeshCollider).
This allows you to control how the paint is rotated.
CameraUp = The rotation will be aligned to the camera.
DrawAngle = The paint will be rotated to match the drawing angle.
ThisRotation = The current Transform.rotation will be used.
CustomRotation = The specified CustomTransform.rotation will be used.
This allows you to specify the Transform when using RotateTo = CustomRotation/CustomLocalRotation.
Should painting triggered from this component be eligible for being undone?
This allows you to override the order this paint gets applied to the object during the current frame.
If the mouse/finger doesn't hit a collider, should a hit point be generated anyway?
InterceptZ = A hit point will be created on a plane that lies flat on the Z axis.
This component works like CwHitScreen, but it will fill in the shape you draw.
This allows you to set the pixel distance between each grid point.
This component will perform a raycast under the mouse or finger as it moves across the screen. It will then send hit events to components like CwPaintDecal, allowing you to paint the scene.
This allows you to control how many hit points will be generated along the drawn line.
StartAndEnd = Once at the start, and once at the end.
PixelInterval = Once at the start, and then every Interval pixels.
ScaledPixelInterval = Once at the start, and then every Interval scaled pixels.
StretchedPixelInterval = Like ScaledPixelInterval, but the hits are stretched to reach the end.
StretchedScaledPixelInterval = Like ScaledPixelInterval, but the hits are stretched to reach the end.
Once = Once at the specified Position and PixelOffset along the line.
This allows you to set the pixels between each hit point based on the current Frequency setting.
When using Frequency = Once, this allows you to set the 0..1 position along the line.
When using Frequency = Once, this allows you to set the pixel offset along the line.
This allows you to connect the hit points together to form lines.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
If this GameObject has teleported and you have ConnectHits or HitSpacing enabled, then you can call this to prevent a line being drawn between the previous and current points.
This component constantly draws lines between the two specified points.
Where in the game loop should this component hit?
The time in seconds between each hit.
0 = Every frame.
-1 = Manual only.
The start point of the raycast.
The end point of the raycast.
How should the hit point be oriented?
WorldUp = It will be rotated to the normal, where the up vector is world up.
CameraUp = It will be rotated to the normal, where the up vector is world up.
Orient to a specific camera?
None = MainCamera.
This allows you to control the pressure of the painting. This could be controlled by a VR trigger or similar for more advanced effects.
Should the applied paint be applied as a preview?
This allows you to override the order this paint gets applied to the object during the current frame.
If you want to draw a line between the start point and the his point then you can set the line here.
This allows you to connect the hit points together to form lines.
This method will immediately submit a non-preview hit. This can be used to apply real paint to your objects.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
If this GameObject has teleported and you have ConnectHits or HitSpacing enabled, then you can call this to prevent a line being drawn between the previous and current points.
This class allows you to easily create components that can have their paint lines connected together to form quads.
The world space distance between each paint point.
0 = No spacing.
When using HitSpacing, this prevents scenarios where something goes wrong and you attempt to paint too many times per frame.
If you enable this then the hit lines generated by this component will be connected into quads, allowing you to paint continuously.
If you enable ConnectHits, then each connected quad will overlap with the next. When using semi-transparent painting, this causes the overlap to become double opacity and look obvious. If you enable this setting, then this overlapping area will be removed.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
If this GameObject has teleported and you have ConnectHits or HitSpacing enabled, then you can call this to prevent a quad being drawn between the previous and current lines.
This component allows you to block paint from being applied at the current position using the specified shape.
The mask will use this texture shape.
The mask will use pixels from this texture channel.
By default, opaque/white parts of the mask are areas you can paint, and transparent/black parts are parts that are masked. Invert this?
If you want the sides of the mask to extend farther out, then this allows you to set the scale of the boundary.
1 = Default.
2 = Double size.
This stores all active and enabled instances in the open scenes.
This component turns the current SpriteRenderer component into a paint mask.
This method will update the sprite mask texture. You must manually call this if you modify the mask's Sprite.
This component marks the current GameObject as being paintable, as long as this GameObject has a MeshFilter + MeshRenderer, or a SkinnedMeshRenderer.
The hash code for this model used for de/serialization of this instance.
If you want the paintable texture width/height to be multiplied by the scale of this GameObject, this allows you to set the scale where you want the multiplier to be 1.
This stores all active and enabled instances in the open scenes.
This will return a list of all paintables that overlap the specified bounds
This will scale the specified width and height values based on the current BaseScale setting.
This is the base class for all paint modifiers. To make a paint modifier, simply inherit this class, and implement one of the virtual methods to modify its data.
Should this modifier apply to preview paint as well?
Should this modifier use a unique seed?
This class maintains a list of CwModifier instances, and contains helper methods to apply them.
This is used instead of a normal list so the modifiers can be de/serialized with polymorphism.
The amount of modifiers in the list.
This stores all modifiers in this list.
This class allows you to randomize the painting angle of the attached component (e.g. CwPaintDecal).
This is the minimum random angle that will be picked.
This is the maximum random angle that will be picked.
The way the picked angle value will be blended with the current one.
This class allows you to randomize the painting color of the attached component (e.g. CwPaintDecal).
This is the gradient containing all the possible colors. A color will be randomly picked from this.
The way the picked color value will be blended with the current one.
This class allows you to change the painting hardness based on the paint pressure.
The paint component's Hardness value will be modified using this value based on the current Blend setting.
This allows you to control how this new Hardness value will modify the old value in the paint component.
Replace = Transition between [old, new] based on pressure.
Multiply = Transition between [old, old*new] based on pressure.
Increment = Transition between [old, old+new] based on pressure.
This class allows you to randomize the painting hardness of the attached component (e.g. CwPaintDecal).
This is the minimum random hardness that will be picked.
This is the maximum random hardness that will be picked.
The way the picked hardness value will be blended with the current one.
This class allows you to change the painting opacity based on the paint pressure.
The paint component's Opacity value will be modified using this value based on the current Blend setting.
This allows you to control how this new Opacity value will modify the old value in the paint component.
Replace = Transition between [old, new] based on pressure.
Multiply = Transition between [old, old*new] based on pressure.
Increment = Transition between [old, old+new] based on pressure.
This class allows you to randomize the painting opacity of the attached component (e.g. CwPaintDecal).
This is the minimum random opacity that will be picked.
This is the maximum random opacity that will be picked.
The way the picked opacity value will be blended with the current one.
This class allows you to randomize the painting position of the attached component (e.g. CwPaintDecal).
The position will be offset up to this radius away in world space.
This class allows you to change the painting radius based on the paint pressure.
The paint component's Radius value will be modified using this value based on the current Blend setting.
This allows you to control how this new Radius value will modify the old value in the paint component.
Replace = Transition between [old, new] based on pressure.
Multiply = Transition between [old, old*new] based on pressure.
Increment = Transition between [old, old+new] based on pressure.
This class allows you to randomize the painting radius of the attached component (e.g. CwPaintDecal).
This is the minimum random radius that will be picked.
This is the maximum random radius that will be picked.
The way the picked radius value will be blended with the current one.
This class allows you to randomize the painting scale of the attached component (e.g. CwPaintDecal).
This is the minimum random scale that will be picked.
This is the maximum random scale that will be picked.
The way the picked scale value will be blended with the current one.
If you disable this then each x, y, and z value will be scaled separately.
This class allows you to change the painting texture of the attached component (e.g. CwPaintDecal) based on the paint pressure.
The painting texture will be changed to this.
The paint pressure must be at least this value.
The paint pressure must be at most this value.
This class allows you to randomize the painting texture of the attached component (e.g. CwPaintDecal).
A random texture will be picked from this list.
This component automatically updates all CwModel and CwPaintableTexture instances at the end of the frame, batching all paint operations together.
This stores all active and enabled instances in the open scenes.
If the current GPU doesn't support async texture reading, this setting allows you to limit how many pixels are read per frame to reduce lag.
This event is called before a component paints something, where 'object' is a reference to the component or link that will do the painting.
Before a component submits paint hits/commands, it will register the 'object' reference to track the painting.
If a component is currently painting, it can call this method.
This window shows you all paintable objects in the scene, and it also allows you to make objects paintable from all paintable presets in your project.
You can open this window from the Window/CW/Paintable Objects menu.
This component can be used to make a SpriteRenderer paintable.
This allows you to control when this component actually activates and becomes ready for painting. You probably don't need to change this.
Automatically change the CwPaintableSprite component's Width and Height to match the sprite?
Automatically change the CwPaintableSprite component's Texture to match the sprite?
Automatically change the CwPaintableSprite component's Advanced/LocalMask to match the sprite?
Automatically generate a mesh collider based on this sprite?
This event will be invoked before this component is activated.
This event will be invoked after this component is activated.
This event will be invoked before this component is deactivated.
This event will be invoked after this component is deactivated.
This lets you know if this paintable has been activated.
Being activated means each associated CwMaterialCloner and CwPaintableTexture has been Activated.
This method will remove all CwPaintableMesh and CwPaintableTexture components from this GameObject.
This component allows you to make one texture on the attached Renderer paintable.
This class stores information about a particular paintable texture state. Either a full texture copy, or a list of commands used to draw it.
This base class allows you to quickly create components that listen for changes to the specified CwPaintableTexture.
This is the paintable texture whose pixels we will count.
Should this counter only read when you're not currently painting?
This allows you to specify the minimum delay between when your texture is painted, and when the data is read.
0 = As fast as possible.
1 = Once a second.
If you disable this, then the texture will be updated immediately, which may cause slowdown.
If you enable this, then the reader will update as soon as it starts. If not, you must manually populate it with default data.
Testing all the pixels of a texture can be slow, so you can pick how many times the texture is downsampled. One downsample = half width & height or 1/4 of the pixels.
This event is invoked each time this texture monitor updates its pixel counts.
This will be true after Register is successfully called.
This forces the specified CwPaintableTexture to be registered.
This forces the specified CwPaintableTexture to be unregistered.
This base class allows you to quickly create components that listen for changes to the specified CwPaintableTexture.
If you want this component to accurately count pixels relative to a mask mesh, then specify it here.
If you have a MaskMesh set, then this allows you to choose which submesh of it will be used for the mask.
If you want this component to accurately count pixels relative to a mask texture, then specify it here.
This allows you to specify which channel of the MaskTexture will be used to define the mask.
The previously counted total amount of pixels.
This component performs an action every time a paint hit is received. Hit points will automatically be sent by any CwHit___ component on this GameObject, or its ancestors.
The event that will be invoked.
This component allows you to debug hit points into the Scene tab. Hit points will automatically be sent by any CwHit___ component on this GameObject, or its ancestors.
The color of the debug.
The duration of the debug.
The size of the debug.
This allows you to paint a decal at a hit point. Hit points will automatically be sent by any CwHit___ component on this GameObject, or its ancestors.
Only the CwModel/CwPaintableSprite GameObjects whose layers are within this mask will be eligible for painting.
If this is set, then only the specified CwModel/CwPaintableSprite will be painted, regardless of the layer setting.
Only the CwPaintableTexture components with a matching group will be painted by this component.
If this is set, then only the specified CwPaintableTexture will be painted, regardless of the layer or group setting.
This allows you to choose how the paint from this component will combine with the existing pixels of the textures you paint.
The decal texture that will be painted.
This allows you to specify the shape of the decal. This is optional for most blending modes, because they usually derive their shape from the RGB or A values. However, if you're using the Replace blending mode, then you must manually specify the shape.
This allows you specify the texture channel used when sampling Shape.
The color of the paint.
The opacity of the brush.
The angle of the texture in degrees.
This allows you to control the mirroring and aspect ratio of the texture.
1, 1 = No scaling.
-1, 1 = Horizontal Flip.
The radius of the paint brush.
This allows you to apply a tiled detail texture to your texture. This tiling will be applied in world space using triplanar mapping.
This allows you to adjust the tiling position + rotation + scale using a Transform.
This allows you to control the triplanar influence.
0 = No influence.
1 = Full influence.
This allows you to control how quickly the triplanar mapping transitions between the X/Y/Z planes.
If your scene contains a CwMask, should this paint component use it?
This stores a list of all modifiers used to change the way this component applies paint (e.g. CwModifyColorRandom).
This method will invert the scale.x value.
This method will invert the scale.y value.
This method increments the angle by the specified amount of degrees, and wraps it to the -180..180 range.
This method multiplies the Opacity by the specified value.
This method increments the Opacity by the specified value.
This method multiplies the Radius by the specified value.
This method increases the Radius by the specified value.
This method multiplies the Scale by the specified value.
This method increases the Scale by the specified value.
This method paints all pixels at the specified point using the shape of a texture.
This method paints all pixels between the two specified points using the shape of a texture.
This method paints all pixels between three points using the shape of a texture.
This method paints all pixels between two pairs of points using the shape of a texture.
This method paints the scene using the current component settings at the specified CwHit.
This component implements the fill paint mode, which will modify all pixels in the specified texture in the same way.
This is useful if you want to gradually fade a texture to a specific color.
Only the CwPaintableTexture components with a matching group will be painted by this component.
This allows you to choose how the paint from this component will combine with the existing pixels of the textures you paint.
The color of the paint.
The color of the paint.
The opacity of the brush.
The minimum RGBA value change. This is useful if you're doing very subtle color changes over time.
This stores a list of all modifiers used to change the way this component applies paint (e.g. CwModifyColorRandom).
This method increments Opacity by the specified value.
This component implements the replace paint mode, which will replace all pixels in the specified texture.
Only the CwPaintableTexture components with a matching group will be painted by this component.
The texture that will be painted.
The color of the paint.
This stores a list of all modifiers used to change the way this component applies paint (e.g. CwModifyColorRandom).
This component implements the replace channels paint mode, which will replace all pixels in the specified textures and channel weights.
Only the CwPaintableTexture components with a matching group will be painted by this component.
This class allows you to easily create components that can have their paint points connected together to form lines.
The world space distance between each paint point.
0 = No spacing.
When using HitSpacing, this prevents scenarios where something goes wrong and you attempt to paint too many times per frame.
If you enable this then the hit points generated by this component will be connected into lines, allowing you to paint continuously.
If you enable ConnectHits, then each connected line will overlap with the next. When using semi-transparent painting, this causes the overlap to become double opacity and look obvious. If you enable this setting, then this overlapping area will be removed.
This component sends hit events to a cached list of components that can receive them. If this list changes then you must manually call this method.
If this GameObject has teleported and you have ConnectHits or HitSpacing enabled, then you can call this to prevent a line being drawn between the previous and current points.
This this is the base class for any component that sends pointer information to any CwHitScreen component.
This component sends pointer information to any CwHitScreen component, allowing you to paint with the mouse.
If you enable this, then a paint preview will be shown under the mouse as long as the RequiredKey is not pressed.
This component will paint while any of the specified mouse buttons or keyboard keys are held.
This component sends pointer information to any CwHitScreen component, allowing you to paint with a pen.
If you enable this, then a paint preview will be shown under the pen as long as the tip is not pressed.
If you want the paint to appear above the pen, then you can set this number to something positive.
This component sends pointer information to any CwHitScreen component, allowing you to paint with a touchscreen.
If you want the paint to appear above the finger, then you can set this number to something positive.
This component allows you to define a set of CwPaintableTexture and CwMaterial components that are configured for a specific set of Materials.
This allows you to name this preset.
None/null = The GameObject name will be used.
This preset is designed to work with the specified shaders.
This gives you a list of all presets in the project.
This method applies the preset components to the specified paintable.
This component allows you to read the paint color at a hit point. A hit point can be found using a companion component like: CwHitScreen, CwHitBetween.
Only the CwPaintableTexture components with a matching group will be painted by this component.
Should the color be read during preview painting too?
How should the texture be read?
Immediate = The reading method will block until the pixel is fetched from the GPU.
Async = The pixel value will be read after some time, giving you better performance.
The last read color value.
When a color is read, this event will be invoked.
Color = The color that was read.
This component allows you to perform an event when the attached CwReadColor component reads a specific color.
This color we want to detect.
The RGBA values must be within this range of a color for it to be counted.
When the expected color is read, this event will be invoked.
Color = The expected color.
This component renders scene depth to a RenderTexture. This scene depth can be set in a CwPaint___ component's Advanced/DepthMask setting, which allows you to paint on the first surface in the view of the specified camera.
The camera whose depth information will be read.
The transformation matrix of the camera when the depth texture was generated.
If this is 0, the RenderTexture size will match the viewport. If it's above 0, then the RenderTexture size will be set to the viewport size divided by this value.
The rendered depth must be at least this mant units different from the painted surface for the paint to be masked out.
If you enable this, then the depth mask will be sampled multiple times per pixel, allowing you to paint both foreground and background objects with little to no edge seams.
Should the scene depth be rendered in Start?
Should the scene depth be rendered every frame in Update?
This stores all active and enabled instances in the open scenes.
This method will update the TargetTexture with what the SourceCamera currently sees.
This class handles the low level de/serialization of different paint objects to allow for things like networking.
This stores an association between a Material hash code and the Material instance, so it can be de/serialized.
This stores an association between a Material instance and the Material hash code, so it can be de/serialized.
This stores an association between a CwModel hash code and the CwModel instance, so it can be de/serialized.
This stores an association between a CwModel instance and the CwModel hash code, so it can be de/serialized.
This stores an association between a Texture hash code and the Texture instance, so it can be de/serialized.
This stores an association between a Texture instance and the Texture hash code, so it can be de/serialized.
This stores an association between a CwModel hash code and the CwModel instance, so it can be de/serialized.
This stores an association between a CwModel instance and the CwModel hash code, so it can be de/serialized.
This struct stores a reference to a texture on a GameObject.
The material index in the attached renderer.
The name of the texture in the specified material.
This allows you to spawn a prefab at a hit point. Hit points will automatically be sent by any CwHit___ component on this GameObject, or its ancestors.
A random prefab from this list will be spawned.
The spawned prefab will be randomly offset by a random point within this radius in world space.
If the prefab contains a Rigidbody, it will be given this velocity in local space.
The spawned prefab will be offset from the hit point based on the hit normal by this value in world space.
The spawned prefab will be offset from the hit point based on this value in world space.
Call this if you want to manually spawn the specified prefab.
This component allows you to manage undo/redo states on all CwPaintableTextures in your scene.
This method will call StoreState on all active and enabled CwPaintableTextures.
This method should be called if you're about to send paint hits that might apply paint to objects. If so, StoreState will be called on all active and enabled CwPaintableTextures
This method will call ClearStates on all active and enabled CwPaintableTextures.
This method will call Undo on all active and enabled CwPaintableTextures.
This method will call Redo on all active and enabled CwPaintableTextures.
This component turns the current sprite into one that can be tapped, which will then invoke an event.
If the mouse/finger moves more than this pixel distance during the click/tap, it will be ignored. This is used to prevent conflicts with dragging.
When this sprite is tapped, this event will be invoked.
This component turns the current sprite into one that can be read when you tap on it.
When a color is read, this event will be invoked.
Color = The color that was read.
This component allows you to manually associate a Texture with a hash code so it can be de/serialized.
The texture that will be hashed.
The hash code for the texture.
This component performs an action every time you undo/redo/etc.
Listen for CwStateManager.UndoAll calls?
Listen for CwStateManager.RedoAll calls?
The event that will be invoked.
All IHit___ interfaces implement this interface so they can all be easily found with GetComponent.
This interface allows you to make components that can paint points defined by UV coordinates.
This interface allows you to make components that can paint lines defined by two points.
This interface allows you to make components that can paint 3D points with a specified orientation.
This interface allows you to make components that can paint quads defined by a pair of two points.
This interface allows you to make components that can paint triangles defined by three points.