4256 lines
2.5 MiB
HTML
4256 lines
2.5 MiB
HTML
|
<!DOCTYPE html>
|
||
|
<html style="margin: 0; padding: 0; height: 98%;" lang="en">
|
||
|
<head>
|
||
|
<title>Paint in 3D - Documentation - 3.1.1</title>
|
||
|
<style type="text/css">
|
||
|
@font-face { font-family: 'gilroybold'; src: url(data:font/truetype;charset=utf-8;base64,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
|
||
|
@font-face { font-family: 'open_sansregular'; src: url(data:font/truetype;charset=utf-8;base64,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
|
||
|
@font-face { font-family: 'fira_monoregular'; src: url(data:font/truetype;charset=utf-8;base64,AAEAAAATAQAABAAwRkZUTYJLMrwAAAE8AAAAHEdERUYE3wXYAAABWAAAAEpHUE9TuP+4/gAAAaQAAAAwR1NVQvu3HdAAAAHUAAAEMk9TLzKXrPKZAAAGCAAAAGBjbWFw+LhN5QAABmgAAAHyY3Z0IAvILZgAAAhcAAAAlmZwZ23eFNvwAAAI9AAAC5dnYXNwAAAAEAAAFIwAAAAIZ2x5Zlp7xdAAABSUAABcyGhlYWQK9ULLAABxXAAAADZoaGVhBWwCgQAAcZQAAAAkaG10eBd9TyAAAHG4AAADwmxvY2FG/l/wAAB1fAAAAfBtYXhwAmsBqwAAd2wAAAAgbmFtZVfJp7QAAHeMAAAEunBvc3T+mkKfAAB8SAAAA2twcmVwbekAoQAAf7QAAACgd2ViZrgAXDYAAIBUAAAABgAAAAEAAAAA19poUgAAAADSFGHqAAAAANhcaH8AAQAAAAwAAAA6AEIAAgAHAAEAaQABAGoAagADAGsA6AABAOkA6gACAOsA8gABAPMA8wADAPQA9gABAAQAAAACAAAAAQAAAAEAAAAAAAEAAAAKACwALgACREZMVAAObGF0bgAYAAQAAAAA//8AAAAEAAAAAP//AAAAAAAAAAEAAAAKAKYBJgACREZMVAAObGF0bgAqAAQAAAAA//8ACQAAAAEAAgADAAQABQAHAAgACQBAAApBRksgAEBBWkUgAEBDQVQgAFhDUlQgAEBLQVogAEBNT0wgAEBQTEsgAEBST00gAEBUQVQgAEBUUksgAEAAAP//AAkAAAABAAIAAwAEAAUABwAIAAkAAP//AAoAAAABAAIAAwAEAAUABgAHAAgACQAKYWFsdAA+Y2FsdABEY2FzZQBMZGxpZwBSZG5vbQBYZnJhYwBebG9jbABobnVtcgBub3JkbgB0c3VwcwB6AAAAAQAAAAAAAgALAAwAAAABAAkAAAABAAoAAAABAAQAAAADAAUABgAHAAAAAQABAAAAAQADAAAAAQAIAAAAAQACAA4AHgAmADAAOABAAEgAUABYAGIAbAB0AHwAhgCUAAEAAAABAH4ABgAAAAIAsADSAAEAAAABAOoAAQAAAAEA+AABAAAAAQECAAEAAAABAQoAAQAAAAEBDgAGAAAAAgEYATgABgAAAAIBUgF2AAEAAAABAZAABAAAAAEBqgAGAAAAAgHCAdwABgAAAAQB7AIGAiACQgABAAAAAQJWAAIAHgAMAOQAbAB8APQAbAB8APMA8gD1APYA6wDtAAEADAASACQAMgBDAEQAUgBqAMYAxwDIAO8A8AADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAHkAAQABAE8AAwAAAAIAEAAWAAEAHAAAAAEAAQAvAAEAAQB5AAEAAQAvAAIADAADAHsAdAB1AAEAAwAUABUAFgACAAoAAgDvAPAAAQACABQAFgABAAYA1wACAAEAFAAXAAAAAQAGANIAAQABABIAAgAKAAIA7wDwAAEAAgAUABYAAwABABoAAQASAAAAAQAAAA0AAQACAO8A8AABAAEA5AADAAEAGgABABIAAAABAAAADQABAAIA7wDwAAIAAQDrAO4AAAADAAEAGgABABIAAAABAAAADQABAAIAJABEAAIAAQATABwAAAADAAEAGgABABIAAAABAAAADQABAAIAMgBSAAIAAQATABwAAAACABIABgD0APMA8QDyAPUA9gABAAYAQwBqAHYAxgDHAMgAAQAaAAEACAACAAYADADqAAIATwDpAAIATAABAAEASQADAAEAFgABABIAAAABAAAADQABAAAAAQAAAAMAAQAWAAEAEgAAAAEAAAANAAEAAAABAAAAAwAAAAEAEgABABYAAQAAAA0AAQAAAAEAAAADAAEAFgABABIAAAABAAAADQABAAAAAQAAAAMAAAABABQAAgAYAB4AAQAAAA0AAQAAAAEAAQADAAEAAAADAAIAGAAeAAEAFAAAAAEAAAANAAEAAAABAAEAAwABAAAAAgASAAYAbAB8AGwAfADrAO0AAQAGACQAMgBEAFIA7wDwAAAAAwJJAZAABQAEAooCWAAAAEsCigJYAAABXgAyATwAAAILBQkFAAACAARAAAKHAgA4AQAAAAAAAAAAQ1REQgBAAA37AgMg/zgAAAQaAghgAACfAAAAAAIPArEAAAAgAAMAAAADAAAAAwAAABwAAQAAAAAA7AADAAEAAAAcAAQA0AAAADAAIAAEABAADQB+AP8BMQFTAXgCxgLaAtwgCiAUIBogHiAiICYgLyA6IEQgXyCsISIl/PsC//8AAAANACAAoAExAVIBeALGAtoC3CAAIBAgGCAcICIgJiAvIDkgRCBfIKwhIiX8+wH////1/+P/wv+R/3H/Tf4A/e397ODJ4MTgweDA4L3guuCy4KngoOCG4DrfxdrsBegAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQYAAAEAAAAAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGEAhoeJi5OYnqOipKalp6mrqqytr66wsbO1tLa4t7y7vb4AcmRlad94oXBr53ZqAIiaAHMAAGd3AAAAAABsfACouoFjbgAAAABtfeBigoWXw8TX2Nzd2dq5AMHF5Obi4+nqAHnb3gCEjIONio+QkY6VlgCUnJ2bwsbIcQAAx3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbAFsARQBFArEAAAIPAAD/LAOn/vcCvP/1Ahr/9f8sA6f+9wBbAFsARQBFArEAAALuAg//9f8sA6f+9wK8//UC7gIa//X/LAOn/vcAWwBbAEUARQKxAAAC7QIPAAD/LAOn/vcCvP/1AwUCGv/1/ywDp/73ACECeQAAsAAsILAAVVhFWSAgS7gADlFLsAZTWliwNBuwKFlgZiCKVViwAiVhuQgACABjYyNiGyEhsABZsABDI0SyAAEAQ2BCLbABLLAgYGYtsAIsIGQgsMBQsAQmWrIoAQpDRWNFUltYISMhG4pYILBQUFghsEBZGyCwOFBYIbA4WVkgsQEKQ0VjRWFksChQWCGxAQpDRWNFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwAStZWSOwAFBYZVlZLbADLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbAELCMhIyEgZLEFYkIgsAYjQrEBCkNFY7EBCkOwA2BFY7ADKiEgsAZDIIogirABK7EwBSWwBCZRWGBQG2FSWVgjWSEgsEBTWLABKxshsEBZI7AAUFhlWS2wBSywB0MrsgACAENgQi2wBiywByNCIyCwACNCYbACYmawAWOwAWCwBSotsAcsICBFILALQ2O4BABiILAAUFiwQGBZZrABY2BEsAFgLbAILLIHCwBDRUIqIbIAAQBDYEItsAkssABDI0SyAAEAQ2BCLbAKLCAgRSCwASsjsABDsAQlYCBFiiNhIGQgsCBQWCGwABuwMFBYsCAbsEBZWSOwAFBYZVmwAyUjYUREsAFgLbALLCAgRSCwASsjsABDsAQlYCBFiiNhIGSwJFBYsAAbsEBZI7AAUFhlWbADJSNhRESwAWAtsAwsILAAI0KyCwoDRVghGyMhWSohLbANLLECAkWwZGFELbAOLLABYCAgsAxDSrAAUFggsAwjQlmwDUNKsABSWCCwDSNCWS2wDywgsBBiZrABYyC4BABjiiNhsA5DYCCKYCCwDiNCIy2wECxLVFixBGREWSSwDWUjeC2wESxLUVhLU1ixBGREWRshWSSwE2Uj
|
||
|
h1{ font-family: 'gilroybold'; line-height: 0%; font-size: 80px; color: #0075D0; margin: 30px; margin-left: 0px; margin-bottom: 60px; }
|
||
|
h2{ font-family: 'gilroybold'; font-weight: bold; line-height: 35px; vertical-align:middle; font-size: 36px; color: #0075D0; margin: 0px; }
|
||
|
h3{ font-family: 'gilroybold'; font-weight: bold; line-height: 22px; font-size: 22px; color: #0075D0; margin: 0px; padding-top: 40px; padding-bottom: 10px; }
|
||
|
h2 b { font-size:20px; vertical-align:middle; opacity:0.5; }
|
||
|
p{ font-family: 'open_sansregular'; font-weight: normal; line-height: normal; font-size: 15px; color: #024274; }
|
||
|
a{ font-family: 'open_sansregular'; font-weight: 600; line-height: normal; font-size: 15px; color: #0075D0; }
|
||
|
a:visited{ font-family: 'open_sansregular'; font-weight: 600; line-height: normal; font-size: 15px; color: #0075D0; }
|
||
|
pre{ font-family: 'fira_monoregular'; line-height: 20px; font-size: 14px; color: #000; tab-size: 4; }
|
||
|
.code{ background: #EDF7FF; border-radius: 5px; padding: 10px; margin: 15px; }
|
||
|
.tip{ background: #EDF7FF; font-family: 'open_sansregular'; line-height: 25px; border-radius: 5px; padding: 10px; color: #0075D0; font-size: 15px; border: 5px; margin: 15px; }
|
||
|
.warning{ background: #FFDCBC; font-family: 'open_sansregular'; line-height: 25px; border-radius: 5px; padding: 10px; color: #FD7C09; font-size: 15px; border: 5px; margin: 15px; }
|
||
|
.error{ background: #FFB6B6; font-family: 'open_sansregular'; line-height: 25px; border-radius: 5px; padding: 10px; color: #FF4545; font-size: 15px; border: 5px; margin: 15px; }
|
||
|
::-webkit-scrollbar{ width: 10px; }
|
||
|
::-webkit-scrollbar-track{ background: #f1f1f1; }
|
||
|
::-webkit-scrollbar-thumb{ background: #0075D0; }
|
||
|
::-webkit-scrollbar-thumb:hover{ background: #555; }
|
||
|
</style>
|
||
|
</head>
|
||
|
<body style="margin: 0; height: 98%;">
|
||
|
<div style="background-color: #0075D0; position: absolute; left: 0px; right: 0px; top: 0px; height: 20px;">
|
||
|
</div>
|
||
|
<div style="position: absolute; left: 350px; right: 0px; top: 20px; bottom: 20px; overflow-y: scroll; padding: 20px;">
|
||
|
<div style="padding-top: 30px; padding-bottom: 50px;">
|
||
|
<h2 style="font-size: 75px; color: #0075D0; text-align: center; vertical-align: middle; line-height: 50px;">Paint in 3D</h2>
|
||
|
<br>
|
||
|
<h2 style="font-size: 30px; color: #0075D0; text-align: center; vertical-align: middle; line-height: 20px;">DOCUMENTATION</h2>
|
||
|
</div>
|
||
|
<div style="overflow:hidden;"><a name="ThankYou"></a><h2>Thank you for using Paint in 3D ❤️</h2><p>If you haven't already, please consider writing a <a href="https://carloswilkes.com/Get/PaintIn3D" target="_blank">review</a>. They really help me out!</p><br><br></div><div style="overflow:hidden;"><a name="Upgrade"></a><h2>How do I upgrade?</h2><p>First, make sure you <b>back up</b> your project files.</p><p>Next, install the latest version.</p><p>If for some reason the latest updates breaks your project (e.g. errors in the console), then try deleting the root folder for this asset, and reinstalling it.</p><p>If it still doesn't work then go back to your previous version, and let me know what the errors are, so I can fix it.</p><br><br></div><div style="overflow:hidden;"><a name="SRP"></a><h2>Is URP/HDRP supported?</h2><p>Paint in 3D supports all 3 render pipelines (Standard, URP, HDRP) in a seamless way that automatically detects your current project settings, and makes the required modifications to the scene so they look similar.</p><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Better Shaders</span></h2><p>This compatibility was made possible using the <a href="http://carloswilkes.com/Get/BetterShaders">Better Shaders</a> system (not required).</p><p>The Better Shaders asset generates multiple variants of each shader ahead of time, so even if you don't have this asset, you will still be able to have full render pipeline compatibility with Paint in 3D.</p><p>BetterShaders (and therefore this asset) currently supports:</p><p><b>Standard Rendering Pipeline from Unity 2019 on</b></p><p><b>URP7.x in Unity 2019.3LTS</b></p><p><b>URP10.x in Unity 2020.3LTS</b></p><p><b>URP12.x in Unity 2021.2</b></p><p><b>URP14.x in Unity 2022.2->2022.3LTS</b></p><p><b>HDRP7.x in Unity 2019.3LTS</b></p><p><b>HDRP10.x in Unity 2020.3LTS</b></p><p><b>HDRP12.x in Unity 2021.3LTS</b></p><p><b>HDRP14.x in Unity 2022.2->2022.3LTS</b></p><p>Support for newer versions will appear when it does in this asset.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Lights</span></h2><p>Each rendering pipeline handles lighting differently. To make the scenes look consistent, each light has the <b>P3dLight</b> component attached to it, which overrides the light intensity for each pipeline.</p><p>If you don't like this behavior then you can set the values (for example <b>IntensityInHDRP</b>) to -1.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Opaque Texture (URP only)</span></h2><p>If you want to use the SgtBlackHole feature, then you must enable the <b>Opaque Texture</b> setting in your pipeline settings asset.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Volume (HDRP only)</span></h2><p>To make HDRP compatibility seamless, each demo scene contains the <b>P3dSceneManager</b> GameObject, which adds the <b>Volume</b> component in HDRP.</p><p>This volume will adjust the scene exposure, disable the visual environment, and disable fog. These are all done to make the scenes look consistent with the other rendering pipelines. If you want to adjust these settings yourself then delete this GameObject, and create your own volume.</p><p>However, for your own scenes you may want to remove this volume component and use your own exposure settings.</p></div><br><br><br></div><div style="overflow:hidden;"><a name="Shaders"></a><h2>Are custom shaders/materials supported?</h2><p>Yes, Paint in 3D is compatible with almost all custom shaders/materials.</p><p>The only requirements are that:</p><p>1 - The texture you want to paint must be sampled in your shader using the mesh UV data (e.g. uv, uv2, texcoord, texcoord2).</p><p>2 - The mesh UV data shouldn't be modified in any significant way (e.g. no tiling or offset).</p><p>3 - The mesh positions shouldn't be modified in any significant way.</p><p>Keep in mind that shaders that perform minor modifications to the position or UV data will still work, but the paint may appear slightly offset (depending on the magnitude of modification performed). Minor modifications would include parallax mapping shaders, tessellated displacement, heat distortion, etc. If you want to paint these kinds of shaders/materials and notice this offset, then I recommend adding some kind of effect to your object when it gets painted to disguise the offset (e.g. particle effects).</p><p>The reason for these requirements is that Paint in 3D applies paint to your mesh using the mesh position and UV data. Paint in 3D doesn't know how your shader is modifying this data, so any modifications the shader performs will result in a discrepancy between where the texture is painted, and where it actually maps to when rendered with your custom shader.</p><div class="tip"><strong>NOTE</strong>  By default the P3dPaintableTexture component targets the <b>"_MainTex"</b> texture slot, which is usually the albedo texture. Some custom shaders/materials use a different texture slot like <b>"_BaseMap"</b>, <b>"_Albedo"</b>, etc. You may have to experiment with different texture slots depending on the shader (you can click the texture slot dropdown to see a list of available textures).</div><br><br></div><div style="overflow:hidden;"><a name="VR"></a><h2>Is VR supported?</h2><p>Yes, this asset has been developed and tested in VR, and supports both multi-pass & single-pass rendering modes.</p><p>Demo scenes like <b>VR HVLP</b> and <b>VR Pen</b> show you how to implement painting using Unity's XR system. While these demo scenes don't have integrations for third party VR systems (e.g. VRTK), integrating them yourself should be easy enough, as the components are designed to work using any system that support inspector events, and thus they shouldn't require any code changes.</p><p>Most of the example components and scenes that come with Paint in 3D are designed for mouse/touch inputs. For example the <b>P3dHitScreen</b> component uses mouse and touch data to paint, so it will not work in VR.</p><p>To paint in VR, you can use the <b>P3dHitBetween</b> component, which allows you to paint between two <b>Transform</b> points. The <b>Paint Between</b> demo scene shows you how to use it, and you can apply the same approach to your VR tool. Most of the example scenes can be modified to work in VR with this change alone.</p><p>Alternatively, the <b>P3dHitNearby</b> component can be used, which will paint anything near the current GameObject. The <b>Asteroid Holes</b> demo scene shows you how this can be used.</p><p>Keep in mind that by default both of these components paint continuously with the same pressure/strength. If you want to be able to toggle painting on and off, or associate your VR trigger pressure with paint pressure, then you will have to write
|
||
|
<h2><span style="">Step 1 - Make Your Object Paintable</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 2 - Make a Texture Paintable</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUIAAADXCAYAAABvcVjYAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+QEGw0aMdqy7NgAAAAVdEVYdEZpbGUgTmFtZQBJbkdhbWUyLnBuZwP6yKcAADvVaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzA2NyA3OS4xNTc3NDcsIDIwMTUvMDMvMzAtMjM6NDA6NDIgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxOS0wMS0yNFQxNDoyNzoyMiswOTowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDIwLTA0LTI3VDIyOjI2OjQ5KzA5OjAwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAyMC0wNC0yN1QyMjoyNjo0OSswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPlBORyBzUkdCPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDoyNTliNDA4NC02NGE0LWYwNDQtYWNkNy0xMjY2ODY2ZTk0MDY8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6M2QyYjI0YjgtYjBjMy01ZTQwLTlmYzYtNDgwYTYyNDJkNTgwPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6M2QyYjI0YjgtYjBjMy01ZTQwLTlmYzYtNDgwYTYyNDJkNTgwPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjNkMmIyNGI4LWIwYzMtNWU0MC05ZmM2LTQ4MGE2MjQyZDU4MDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOS0wMS0yNFQxNDoyNzoyMiswOTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3M2ExNzQ3MC1hZTE1LWExNDgtOWI2NC0zZGMxMjhlNGI5Zjg8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMjAtMDQtMjdUMTA6NTc6MzYrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MjU5YjQwODQtNjRhNC1mMDQ0LWFjZDctMTI2Njg2NmU5NDA2PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDIwLTA0LTI3VDIyOjI2OjQ5KzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdG
|
||
|
<h2><span style="">Step 3 - Make Your Material Clone Itself</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 4 - Paint It!</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 0 [Optional] - Make a New Scene</span></h2><p>Before you paint objects in-editor, I recommend you make a new scene (e.g. copy+paste your objects into a new scene). This is because configuring your objects for painting requires the scene to be modified (these modifications can easily be removed though).</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Step 1 - Open Paint in 3D</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 2 - Make Objects Paintable</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 4 - Make Materials Paintable</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 5 - Export Material & Textures</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 6 - Open Paint in Editor</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Step 7 - Save</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAABfCAYAAAC+7MiRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABR5SURBVHhe7ZtnWxRpFob5Qftpdifv7szsjOPsBCMikpFgwJxHx4QBQUGCBEVyFJCckZwaUIKigznnNDP7A86e5+2uorq7gAa7m/R+uC+7q7qKpnnu95xT1bq0tbWRROIsolIyKKO2mfKau6jEMECVAzeobvg2NY48oNa7T6n9/jPqePiCOh++pK5Hr6jr8WvqfvKGDE/fOgQpgMSpnGYBMuuaKb+lm0p7Bqlq4Heqv36Hmm4+pPZ7HP4Hz6mLw9/N4Tdw+A0c/h4Oau+zd1MAx42PFEDiVKJTMyirvpkKWrupvHeQagZ/p0s37lDLrYfUwat/58PnHP6XHP5X1PPkNYf/jQhq3/N3DkEKIHEq0WmZlN3QQgXtBiq/PES1V0e4/blLrXceifB3PX7Bqz6H/+lrDj6H/zmH/8U7uvzyvW28sBU+JyMFkDiVGBYg51ILFbIAFVeGqO7aCLc/d6nt7iPu+Xn1f/KCw/+Kw/+aV+g3HP63HOx3dOXVe4cgBZA4lZj0TMptbKWiDgNV9l+l+uERar55j/v/x9SN1f/pSzX8lzXh73/9h0OQAkicSmx6FuU1tVFxZw9VswCXro9Q66171Hn/Mff8Lzj8L+ny89d05cUb6n/5lvpfvaOB1+9p8M0fU2ZgHKQAEqcSl5FF+c1tVNLVQzUD16jxxk1qvX2fuh48od6nL6jv2Ss1/AOa8A+9/dMhSAEkTgUCXGhup5LuXqodHKbG329R250H1PXwKYffuPr3v3zD4X9Lg6/fcfjfc1D/oKvv/nQIUgCJUzmTmUUFre1UauiluqvD1DRyi/v/B9z/P+We/yVdefmaV30O/5t3NKQJ/7X3fzkEKYDEqcRnZVNhWzuV9/RR/bXr1HLzNnXcf0iGJ8+49XnFPf8bY/jfvufgc/jfc/j/+IuG/9QB2z8QKYDEqUCAovZ2qujto4bh6zwA3+b+/yH3/8+49XnFbc8buvr2HV17955X6D84pH/SdQ77jb/+p3LdFv60DSmAxKnoVYBOrgA9pgowwBVgiCvAVVMF0ErgCKQAEqcSn5VlEqCXBRhmAW6xAA9YgKcswEsW4DUN8Qxw1STBNZZgmNug69yu2IJemzMeUgCJUzEOwW1UZujhIfgaNY/cpI5798nw+AkL8EJtg4besATcCl3VtEJThgUaCymAxKmcycykgpZWFsBAdUNXWYAR6rh7jwyPHtPl5y/UKqBIMKSRwBFIASRO5UwGC9DcQqXdLMDgEDX9PkLtd+5S98NHdPnZc7rCEgygCohWaLQSiKHYAUgBJE4lLiODLjQ3U0lXN9UODFLjjd+p7fYdcSWo7+kzIUE/qoBJArN2yAFIASROJS49nfIbm6iko5Nq+vupEZdCeRDu4jmgl+cASHAFEqASaEQQ1UCFWyM7IQWQOJXYtHTKu9RIxe0dVH2lny5dG2YBblInzwE9PAf0PnlKlzUSmFUDGxmaBFIAiVOJTU2j3IYGutjWTlV9l6mBB+EWngM6uA0y4IYYhmFcEWIR+nFzjEUYYBEGWQRzWApLIMokkQJInEpMSirl1tVTUUsrVeJewOAgNfMc0HHrNhlwP4CH4T6NBFc0EjgCKYDEqcSkpFBObS0V8iBcgXsBAwPUxHNA28hN6uI2qJsl6H3IAzGuCllWA3vz7JkUQOJcTp9LpszKKrrQcInKeBCuxneCUAWuX6d2HobRCgkRMBPwYNwDIXCFCJVB4ZGWx7oIebQ8VnhihhRA4lQik5IorbSMcmpq6WJLC1V0dVHNZZ4FBoeoGVeEcFmUqwFk6AT4shxL0Y17BXcVjIKMhQHcU7g/LlIAiVM5GZ9A54suUmZFJRVwFShpbaPK7m6q6eNKgPsCPBQ3XRsWMrRAiOs3qI2laMcNsxEFFmQcOm4qcEWZACmAxKmEx8VRUv4FSispoVyuAoWNjVQKCVAJWII6rgb1/QNChktcFRpxtxhfmcD3hsA1BZZkLIaHWR4Fo0i6cNslBZA4lbDoaIrPzqbkggLKLC+nvNo6KmpsEhJUdHZRVVc3VfNwXNPbS7UQou8yS3GF6q/0CxoU+rWwMDpc4gHbCMs0BlIAiVM5FhklboYl5uRS6sViyqqooHxcFbrE7RDPBKX4qnR7B1XwgFwJIQC3SNUGg4kelRqFHoVeXWohk0qfGVIAiVMJjThJkeeSKS49g85d4FaouJiyeR7Iq66hwvoGKsJdYq4Ixfi+EIRoaRXVoRxiKLRr6VCpEOJo6bSislNLlxRA4lwOhZ2g8IQEij5/nhLQCl0ooDRUgrJyyq2soryaGrrAFeFCXb1RCB6UwUWeFUZpEghRQJNCsxklACKptFghBZA4lf1Hj9HxmFg6mZhIsamplJjFEuTnU2phEWWUllJmWRnl8GyQw1VBCFFVzdWhmvJZDHCBB2czIIugTlCgUKelXqWwXkuDFEDiXPYdDqXQU5EUxhJEnT0rJEjIzKSzPBOcRzUoLKT0ixcFGcUllFnCUjBZLEa2SvkoLAvIKa8YheeKUVgkhUotVQIpgMSp7DlwgA6EhdGRU6coPO4MRSUlUQy3Q2fS0ykpK4vOZedQcm4enc9juDKk8JyQAjEKCo2wIEaKVNKLtLA8QJFIUDwKzxxGWC5GCiBxKrv27aNfDx+mA8fDxBWh8NhYisRMwNUg7nwKnUlNowSWIRFkZFJSZpYQ4yzPC+cEOUZyRknm6iHI1cICKSKp5BuBWCakABKnsn33btr522+0lyXAQHyUK0HY6dN0MjaOoliE01wRIEPMuWSKxdUirg7gTArLkZLKgqRSvEqakTSWRiXdCAukipSeYSRDgcUScmWSS19fH30o5dyD6W2fC/yt6G8U1BcksQMflX9EW7bvoK27dtFOrgSQ4OCxYxQaHk7HWIQTLEJ4dAzLEEun4uKYMxR5Jp4i4+PpNORISDTCAzSITmRZAKRRYXkgkMo5lukcy6RgFCs22YgUYAKkAPYDAmzcsoU2MFt27KBde/fSXp4J9oeG0qGjLMIJrgiQISKCjp88RcdRHSIj6QQTHsVyQBBBNEVEa4mhiBgWRyVWSCREEkCmUSKFWEakABMgBbAfEGB9SAitWbeOQjZu5GqwnXbs2k27IcL+/fTbwUO0H1UBQhw5ylIcpcOoEMwRDM4mjqJ1giyCcKM0KhFGgQQnWaRRwliqMEgliBRySQEmQApgPyDAmjVryH/1agoODqaQDRto0+bNtHXbNtqxcyft3rOH9vz6K/2K9ojZx7PCPoiBKgEOHlQ5wLIcOKTA0kAcQagQSEgUeoRFGuUwhFIxiiUFmAApgP2AAAEcfi8PD/Lz8aGggABay0KErF9Pm1iGLZCB26PtW7fRdkjBFWInWiWWQ8Czw24BVw0epsEeSKMAeRS4qoC9wCSUKpUCyyUFmAApgP2AAAj+Stfl5LFyJfmwCP78PNDPj9awGOsCA2k9KgNLsYHZyK0S2ARBuHXaDEnQOpnYummTEYjDbAMsENguRNpqBDIpoO2CWDyMQy6HCXD8+HFqb2+32m5PUlNTqbi4WHcfSMGlMx50tNs6OzvFe7N8PBZ6Avzn+H/o68NfC/B4SfoSCuo1f81k0Z5TYVXFKt3X2hv/Dn8K6A7Q3aewKGUR/ffMf822re5cTd8e/9bq8VhAAATe3dWVPFkAX09PWo1KoBUgKIhCIAEDCYQIa9eOi/I6lbWAt2tQX69IZRLLYQJsYFtbWlqsttuTqKgoys7O1t3X09NDW3gV2MgrhVZEPN7Eq4bl47HQE+DjDR+TW7EbedZ40sqSlfTVwa/oh9gfrF43GbTnVEAw9V5rbxZELKBlOct094HAnkD6dMun9MnGT8i/ffQ94fEnmz6xejwWoxXA1VgBWA
|
||
|
<h2><span style="">What if I don't know how to UV map?</span></h2><p>Unity can automatically do it for you. Just keep in mind that doing it manually will allow you to achieve better results.</p><p>To automatically generate UV data, you can enable the <b>Generate Lightmap UVs</b> setting in your mesh import settings. This will generate UV data suitable for painting, and they will be stored in the <b>second</b> UV channel.</p><div class="tip"><strong>NOTE</strong>  Most shaders (including all default Unity shaders) only read data from the <b>first</b> UV channel, so this new UV data won't be used. To use it, you must either use a shader that reads from the second UV channel instead of the first, or copy the new UV data from the second UV channel to the first.</div><div class="tip"><strong>NOTE</strong>  If you want to remove UV seams from this newly generated UV data, then you will have to run the <b>second</b> UV channel through the <b>Seam Fixer</b> tool.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Does Paint in 3D come with shaders that use the second UV channel?</span></h2><p>Yes, Paint in 3D comes with several shaders designed to solve this issue.</p><p>If you want to keep your original shader/material that uses the first UV channel, then you can use the <b>Paint in 3D / Overlay</b> shader on top of your base material. Paint in 3D already comes with a pre-configured material called <b>Overlay (Second UV Coord)</b>, which you can add on top of your base material. Keep in mind you will now be painting the second material (index 1), so you must update your <b>P3dMaterialCloner</b> and <b>P3dPaintableTexture</b> component settings to target the second material slot index (1).</p><p>This technique is demonstrated in the <b>UV Requirements / Automatic Overlay</b> demo scene.</p><div class="tip"><strong>NOTE</strong>  If your mesh has multiple sub-meshes, then this technique won't work.</div><p>If you don't mind replacing your original shader/material, then the <b>Paint in 3D / Solid</b> shader can be used instead. This shader uses the first UV channel for base textures, and then allows you to override the albedo/opacity/smoothness/etc using secondary textures that use the second UV channel.</p><p>This technique is demonstrated in the <b>UV Requirements / Automatic Secondary</b> demo scene.</p><div class="tip"><strong>NOTE</strong>  The secondary/override textures in this shader use premultiplied alpha blending, so you should change your paint brushes to use the <b>Premultiplied</b> blending mode.</div><div class="tip"><strong>NOTE</strong>  You should expand the <b>P3dPaintableTexture</b> component's <b>Advanced</b> menu, and change the <b>Conversion</b> setting to <b>Premultiply</b>.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">How do I copy UV data from the second UV channel to the first?</span></h2><p>Paint in 3D comes with the <b>Coord Copier</b> tool, which allows you to do this.</p><p>To use this tool, select your mesh in the <b>Project</b> window, and click the context menu (⋮icon) button at the top right of the inspector, and select the <b>Coord Copier (Paint in 3D)</b> option.</p><p>Your <b>Project</b> window should now contain a <b>Coord Copier (YOUR_MESH_NAME)</b> prefab, and you can click <b>Generate</b> to copy the coords over.</p><p>The generated mesh with the copied coords is now placed as a child of the <b>Coord Copier</b> prefab, and you can drag and drop it into your <b>Mesh Filter</b> or <b>Skinned Mesh Renderers</b>.</p><div class="tip"><strong>NOTE</strong>  This tool will overwrite the UV data in the first UV channel. If you still need this data, then this solution isn't suitable for you.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Can I use the second UV channel with the Standard shader?</span></h2><p>Kind of. Using the following steps you can get it working using the detail texture. Just keep in mind this isn't the best solution, because it doesn't replace the albedo exactly.</p><div class="tip"><strong>Step 1</strong> Select your material that uses the <b>Standard</b> shader, and change the <b>Secondary Maps > UV Set</b> setting to <b>UV1</b>.</div><div class="tip"><strong>Step 2</strong> Select your <b>P3dPaintableTexture</b> component, and change the the <b>Slot</b> setting from <b>_MainTex</b> to <b>_DetailAlbedoMap</b>.</div><div class="tip"><strong>Step 3</strong> Change the <b>Channel</b> setting to <b>Second</b>.</div><div class="tip"><strong>Step 4</strong> Change the <b>Shader Keyword</b> setting to <b>_DETAIL_MULX2</b>.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">How can I use the second UV channel with a different shader?</span></h2><p>Most shaders only the first UV channel, so you will need to make an alternative shader that uses the second.</p><p>For example, instead of using <b>uv_MainTex</b> you use <b>uv2_MainTex</b>, or instead of using <b>texcoord0 : TEXCOORD0</b>, you use <b>texcoord1 : TEXCOORD1</b>.</p><div class="tip"><strong>NOTE</strong>  When painting using the second channel, you must set the <b>P3dPaintableTexture > Channel</b> setting to <b>Second</b>.</div><p>Paint in 3D comes with a range of shaders that allow you to specify the UV channel used (e.g. P3d Opaque).</p></div><br><br><br></div><div style="overflow:hidden;"><a name="Seams"></a><h2>Fixing UV Seams</h2><p>When you make complex 3d models it's inevitable your mesh will have UV seams, where one part of the texture is disconnected from another.</p><p>This normally isn't a problem with clever texturing, but when painting it can result in visual seams between these disconnected UV islands (see the seams around the shoulders on the zombie image).</p><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">How do we fix them?</span></h2><p>To fix these UV seams, Paint in 3D comes with a tool that can convert a normal mesh with UV seams into a fixed mesh without UV seams.</p><p>To access the tool, select any mesh in your project, click the context menu icon (⋮ button) at the top right, and select <b>Fix Seams (Paint in 3D)</b>.</p><p>This creates a seam fixer in your project, and automatically sets the <b>Source</b> mesh to the one you picked.</p><p>If you want to see the result of the seam fixing, set the <b>Debug Scale</b> setting to 10 or so.</p><p>You can now press the <b>Generate</b> button to generate the fixed mesh.</p><p>If it was successful, you should see something like this in your <b>Scene</b> window:</p><p>Where the green lines are the original seams, and the blue lines are the new fixed seams. The blue lines should be outside of your original green lines. If your blue lines are overlapping then try reducing the <b>Border</b> setting a little, or the <b>Threshold</b> setting.</p><div class="tip"><strong>NOTE</strong>  Fixing seams adds vertices to your mesh. If your mesh was already close to the mesh vertex limit then this tool may not work for you.</div><div class="tip"><strong>NOTE</strong>  This tool isn't magic. If your original UV map is laid out poorly then this will won't fix it.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style=""> How do we use the fixed mesh?</span></h2><p>The generated mesh will be placed as a child of the seam fixer in your <b>Project</b> window.</p><p>To use it, just drag and drop it from here into your <b>MeshFilter</b> or <b>SkinnedMeshRenderer</b> that uses this mesh.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style=""> Auto Seam Fixer</span></h2><p>If the above steps seem too tedious for you, then you can let Paint in 3D automatically do the seam fixing for you.</p><div class="tip"><strong>STEP 1</strong> Select your paintable GameObject.</div><div class="tip"><strong>STEP 2</strong> Find the <b>P3dPaintable</b> component in the inspector window.</div><div class="tip"><strong>STEP 3</strong> Expand the <b>Advanced</b> settings.</div><div class="tip"><strong>STEP 4</strong> Change the <b>UseMesh</b> setting to <b>AutoSeamFix</b>.</div><p>Your mesh will now be auto seam fixed just before you paint it for the first time.</p><div class="tip"><strong>NOTE</strong>  This technique doesn't allow you to adjust the seam fix settings.</div><div class="tip"><strong>NOTE</strong>  This technique has some performance overhead when you first paint your object, because the mesh must be seam fixed before it can be painted.</div><p>If either of these caveats is an issue, then I recommend you follow the previous section and manually seam fix the mesh.</p></div><br><br><br></div><div style="overflow:hidden;"><a name="UV_Examples"></a><h2>Examples Of UV Maps</h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Example 1</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Example 2</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Example 3</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style=""> UndoRedo Setting</span></h2><p>The first step is to select your <b>P3dPaintableTexture</b> components, and enable the <b>UndoRedo</b> setting.</p><p>If you're painting animated objects then you should set this to <b>FullTextureCopy</b>, but for most scenarios you can use <b>LocalCommandCopy</b>.</p><p>If you use the <b>FullTextureCopy</b> state mode then you must also set the <b>State Limit</b> setting. A value of 10 means you can undo paint operations 10 times, and then redo them 10 times. If you paint 11 times with this setting then your initial paint state will be deleted, and you will only be able to undo 10 times to your first paint operation.</p><p>You can read the <b>P3dPaintableTexture</b> documentation for more details.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Store States</span></h2><p>The next step is to find your painting components, and enable the <b>Store States</b> setting.</p><p>This setting will automatically call the <b>StoreState</b> method on each <b>P3dPaintableTexture</b> in your scene, letting Paint in 3D know that you're about to paint on them.</p><p>For example, the <b>P3dHitScreen</b> component has the <b>StoreStates</b> setting, as well as <b>P3dToggleParticles</b>, and <b>P3dTapThrow</b>.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Buttons</span></h2><p>Finally, you can add the <b>P3dUndoAll</b> and <b>P3dRedoAll</b> components to your UI elements, and they will automatically be set up so when you click them they perform an undo or redo operation.</p><p>And that's it, your game should now have Undo & Redo paint functionality!</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Memory Usage</span></h2><p>Keep in mind that when using the <b>FullTextureCopy</b> mode, each undo/redo state is stored as a full texture state. This means that if your texture is 1024x1024 using the RGBA32 format, then each undo/redo state will consume 1024x1024x4 bytes of memory, or 4 megabytes.</p><p>If your game requires a lot of undo states and you want to reduce memory usage, then you should use the <b>LocalCommandCopy</b> mode instead, which will store a list of all paint commands (e.g. decal texture + paint orientation). This approach can reduce memory usage a lot, and it allows unlimited undo levels, but performing an undo requires rebuilding the texture from scratch, which can be slow if you have a lot of undo states. It also may not work correctly if your mesh is animated, because the paint will apply to different areas if your mesh has changed.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Manual Undo & Redo</span></h2><p>The undo & redo functionality listed above works well for most games, but it's not suitable for all scenarios. To get full control you can manage it yourself using the following methods in the <b>P3dPaintableTexture</b> class:</p><p>Call <b>StoreState</b> before you apply paint to your objects.</p><p>Call <b>Undo/Redo</b> after, when you want to undo or redo.</p><p>These methods can also be accessed from the <b>P3dPaintableTexture</b> inspector context menu (⋮ button at top right), so you can test it from the editor.</p></div><br><br><br></div><div style="overflow:hidden;"><a name="Blend"></a><h2>Blend Modes</h2><p>Blend modes allow you to change the way your painted pixels are applied to your textures.</p><p>If you're using in-editor painting, then you can right click a material to select it, and change the <b>Blend Mode</b> of the <b>P3dPaintDecal</b> components you wish to modify.</p><p>If you're using in-game painting, then you can change the <b>Blend Mode</b> in the painting components (e.g. P3dPaintSphere, P3dPaintDecal).</p><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Alpha Blend</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAgmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowMyswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDMrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjgyNmFlZjQ3LTYwZGEtMWM0MC1iMjA5LTlhZDM3YjliYmZlMTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjJlZTAxY2JiLTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6YjNjMmRhYTEtN2M5ZC1jYjQ2LWJiZDctZjI4NzY0MTc5ZDgxPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjAzKzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjgyNmFlZjQ3LTYwZGEtMWM0
|
||
|
<h2><span style="">Alpha Blend Inverse</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAjmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowMzowOSswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDM6MDkrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOmE3ZDVmODkzLWFmZWMtNWQ0NS1iMTlkLWMwMzAyOWU0OTUxNTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2YmE1MDVhLTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6ZjFmODMyNzktZDNkOC00OTQxLWJiZjQtMjIzYTA4Mjk4NmJjPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjAzOjA5KzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmE3
|
||
|
<h2><span style="">Alpha Blend RGB</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAjmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowMzoyOCswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDM6MjgrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjA2MmNiYWI5LTk4OWMtMTU0ZS05ZTJiLWJmZDA5M2Y3NjBhZTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjQwMjg5NGU3LTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MWRiMTg4YWUtYWRjNC0xYzRjLWJhMjEtYmI0MWJmOGMzOWJiPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjAzOjI4KzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjA2MmNi
|
||
|
<h2><span style="">Additive</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAjmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowMzo1NiswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDM6NTYrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjMyY2EyYTdhLTgyZGYtY2E0OS05NjY2LWVjMDkwYWRmNzdjYjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjUyMzJhYjZjLTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NDM5MmQ0MWQtZTAyOC00NTQ5LTgyM2UtZjM0ZThkZmY3NmViPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjAzOjU2KzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjMyY2EyYTdhLTg
|
||
|
<h2><span style="">Additive Soft</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAjmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowNDoyNSswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDQ6MjUrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjRiYmJiMjUyLWIxMzYtYjQ0Ny04MTU5LWZmNDZlZDk2YzdiMjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjViZWYxZjcyLTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NDllNTkzZjgtZGIwMC1jYTRmLTk3ZTAtZTkwZjg0ZjIyZTQzPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjA0OjI1KzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjRiYmJiMj
|
||
|
<h2><span style="">Subtractive</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAjmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowNDozNCswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDQ6MzQrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjBhMTBiMTFkLWQyMmMtY2E0NS05MzE4LWZmNDZkZjdiZmFjNDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjY4YTgyOTNhLTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6ZDBlNTRmNmItMzJkZi1lNDQ3LWE3YTYtMGNjMTY0NDNlZmI2PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjA0OjM0KzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjBhMTBiMTFk
|
||
|
<h2><span style="">Subtractive Soft</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAjmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowNTo0MSswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDU6NDErMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjI3NDNlYzAyLTA3OTktNGE0Yi1hZWEyLWFlYTMyMzc4MTc3MjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjkwMjRjZWI4LTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6Mzk2ZTdiZDMtNmExMS1mODRjLTg3NzctNjIxNzBhMTU5NDlkPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjA1OjQxKzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjI3NDN
|
||
|
<h2><span style="">Replace</span></h2><p>This blending mode works like <b>Alpha Blend</b>, but the alpha channel of the texture will transition toward the paint alpha channel value, rather than just increase. In effect, this blends all channels toward the paint color at the same rate.</p><p>This is useful for painting advanced textures (e.g PBR), where you want to paint a specific alpha channel value.</p><div class="tip"><strong>NOTE</strong>  Decal painting normally stores the shape of the decal in the alpha channel, but because this mode allows you to replace all channels, the shape must be stored in a separate <b>Shape</b> texture.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Replace Original</span></h2><p>This blending mode works similar to <b>Replace</b>, but instead of transitioning to the paint color, the paint color will be based on the original color of the texture.</p><p>This color is defined by the <b>P3dPaintableTexture</b> component's <b>Texture</b> and <b>Color</b> settings.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Replace Custom</span></h2><p>This blending mode works similar to <b>Replace Original</b>, but instead of transitioning to the original texture color, you can specify a custom texture and color to transition to.</p><div class="tip"><strong>NOTE</strong>  This blending mode ignores mesh UV, so it may produce unexpected results if your meshes have very different UV data.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Multiply Inverse RGB</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABAjmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE5LTExLTA5VDEzOjMyOjU5KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOS0xMS0wOVQxNDowNjozNCswOTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTktMTEtMDlUMTQ6MDY6MzQrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjlmZDBkZmRhLWVkYTMtYWE0Ny05Zjc5LWYxMTAyY2NiMTkzNTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmIzOGQ4NzcxLTAyYWUtMTFlYS1iNWNhLWU5YmQxYzM5ZjdkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjA3ZjVkOTZjLWZiODYtYzg0ZC1iNjdlLWVmMjg2Njk3YjIzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowN2Y1ZDk2Yy1mYjg2LWM4NGQtYjY3ZS1lZjI4NjY5N2IyMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTktMTEtMDlUMTM6MzI6NTkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MDhhYWJmMzItNTg2My0xMjQ4LWE3YjMtNGM3MWI1MTJiN2U0PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE5LTExLTA5VDE0OjA2OjM0KzA5OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjl
|
||
|
<h2><span style="">Blur</span></h2><p>This blend mode allows you to blur your texture based on the paint opacity.</p><div class="tip"><strong>NOTE</strong>  This effect works by sampling pixels around the current pixel. This means it's possible for colors outside the mesh to 'bleed' in. To avoid this issue, you must set the <b>P3dPaintableTexture</b> component's <b>Advanced / LocalMask</b> setting. This texture can be created using Paint in 3D if you begin with a black paintable texture, paint it white, and then save that texture to be used as a local mask.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Normal Blend</span></h2><p>This blend mode allows you to paint a normal map with another, and both normal maps will combine together.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Normal Replace</span></h2><p>This blend mode allows you to paint a normal map on top of another, and the original normal map will be replaced by the new one.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Flow</span></h2><p>This blend mode allows you to move the pixels in the texture you're painting. The direction and distance the pixels will move is based on the normal map you specify.</p><div class="tip"><strong>NOTE</strong>  This effect works by sampling pixels around the current pixel. This means it's possible for colors outside the mesh to 'bleed' in. To avoid this issue, you must set the <b>P3dPaintableTexture</b> component's <b>Advanced / LocalMask</b> setting. This texture can be created using Paint in 3D if you begin with a black paintable texture, paint it white, and then save that texture to be used as a local mask.</div></div><br><br><br></div><div style="overflow:hidden;"><a name="Blend"></a><h2>Skinned Mesh Painting</h2><p>Paint in 3D allows you to paint skinned meshes. The set up is almost the same, where you add the <b>P3dPaintable</b> component alongside the <b>SkinnedMeshRenderer</b> component. However, there are some things to keep in mind.</p><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style=""> Colliders</span></h2><p>To paint objects in your scene you need to use a hit component like P3dHitScreen, P3dHitParticles, etc. Some of these components like P3dHitNearby will apply in 3D without the need for colliders, but components like P3dHitScreen use Physics.Raycast, which means your paintable objects need colliders.</p><p>Normal non-skinned meshes are usually static, so you can just add a MeshCollider. However, skinned meshes usually bend and deform such that you cannot use a MeshCollider, because as soon as it animates, the collider surface will not match the visual mesh, which causes the paint to apply to the wrong area.</p><p>While the collider doesn't have to match the visual mesh, it needs to be close enough relative to the size/radius of your paint tool (e.g. P3dPaintDecal's Radius & Scale settings). If you have a complex skinned mesh, this usually means you must add many colliders to your object (e.g. BoxColliders and CapsuleColliders, perhaps one per bone).</p><p>However, if your game doesn't require precise painting (e.g. bullet wounds only), then there is one alternative strategy that is simpler to configure that is shown in the <b>"PaintIn3D/Examples/Zombie Blood"</b> demo scene. In this scene, the skinned zombie mesh is given one large BoxCollider, that encapsulates the whole zombie animation cycle. The P3dHitScreen component's RotateTo setting is set to <b>Normal</b>, and RotateTo/Direction is set to <b>RayDirection</b>. The P3dPaintDecal component's <b>Scale.z</b> setting is then set to 15 (the exact value depends on the size of the skinned mesh). With this configuration, the paint is aligned to and stretched along the hit direction, so it goes through the skinned mesh.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style=""> Include Scale</span></h2><p>Inside the <b>P3dPaintable</b> component is the <b>IncludeScale</b> setting. Depending on your skinned mesh, you may need to enable this setting for the painting to work.</p><p>I wasn't able to identify exactly when this setting needs to be enabled or disabled, so it can't be automatically set. I think it has something to do with the software used to export the mesh, or the export settings, so for now you must manually try toggling this if you find your mesh can't be painted even if every other setting looks correct.</p></div><br><br><br></div><div style="overflow:hidden;"><a name="Lines"></a><h2>Drawing Connected Lines</h2><p>When painting using components like <b>P3dHitScreen</b>, you may notice your paint can appear as separate dots. This can easily happen if the object you're painting is far away, your paint brush radius is low, or the surface you're painting is at a sharp angle relative to your camera.</p><p>This happens because the paint is actually applied as a dot, and to make a continuous line the dots are simply placed close enough together that they no longer appear as dots. However, under certain circumstances this illusion can be broken.</p><p>To improve this, the easiest way to is to just lower the <b>P3dHitScreen</b> component's <b>Interval</b> setting. This will increase the amount of dots drawn by reducing the pixel distance between them. However, this carries a performance penalty, and it only makes the issue less apparent, it doesn't solve it.</p><p>To solve this issue you want to have each separate dot connect together to form a continuous line, and this can be done by enabling the <b>Advanced / Connect Hits</b> setting. This setting appears on components like <b>P3dHitScreen</b>, <b>P3dHitNearby</b>, and <b>P3dHitBetween</b>. Instead of sending hit point information to paint components, it will instead connect the hits points, and send out hit lines.</p><div class="tip"><strong>NOTE</strong>  The lines are connected together from each hit point. Since there are a limited number of hit points, this means it's possible that the lines can skip over complex geometry and look incorrect. To reduce this issue you can reduce the <b>Interval</b> setting, just keep in mind this has a performance penalty.</div><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style=""> Overlap Points</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,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
|
||
|
<h2><span style="">Texture Resolution</span></h2><p>The easiest way to optimize painting performance is to reduce the size of your <b>P3dPaintableTexture</b>. If you halve the width & height of your texture, then there are now only 1/4 of the pixels being painted, which means your paint will apply up to 4x faster.</p><p>I recommend you reduce the texture resolution as much as possible, until you find the perfect balance between performance and visual quality.</p><div class="tip"><strong>TIP</strong> If your object has a high resolution texture that you can't reduce, but your paint doesn't have to be as high detail - you can separate your paint from your high resolution texture. This can be done by painting on a separate (lower resolution) texture, and blending this into your (higher resolution) base texture. This technique can be done using a custom shader with a separate paint texture, or using a transparent paintable material laid on top.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Paint Framerate</span></h2><p>Another easy way to optimize your painting is to paint less often.</p><p>For example, the <b>P3dHitScreen</b> component has the <b>Interval</b> setting, which allows you to choose the pixel distance between each paint hit. If you set this to 3 pixels and move your mouse/finger 300 pixels in one frame, then this will result in your scene being painted 100 times. If you increase this to 6 pixels, then it will result in the scene being painted 50 times, or a 2x optimization. You can also set the <b>Frequency</b> to <b>OnceEveryFrame</b>, which will paint the scene no more than once per frame.</p><p>For example, the <b>P3dHitParticles</b> component by default paints every time a particle hits something. This can be optimized using the <b>Advanced / Skip</b> setting, which allows you to paint once every <b>n</b> times.</p><div class="tip"><strong>NOTE</strong>  If you paint less often, then gaps may appear in your paint. If the hit component you're using supports it, you should enable the <b>Advanced / Connect Hits</b> setting, which will fill these gaps in.</div><div class="tip"><strong>NOTE</strong>  If you can't or don't want to use connected hits (e.g. you're using paint modifiers, or a component that doesn't support them) you can compensate for the lower painting frequency by increasing the paint radius, or the paint opacity.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Split Meshes</span></h2><p>If your object has a large texture and you cannot reduce its resolution, then you can still optimize the painting without a loss in detail. This is done by splitting your mesh up into smaller parts, and setting them up as separate objects. If done correctly, when you paint your object only a small area of it will be painted, and thus less pixels will be processed overall.</p><p>The easiest example of this is painting a large wall. Instead of having one wall mesh, you can split it up into a grid of smaller sections. If done correctly you will still have the same overall texture resolution, but when painting you will only every paint a small number of meshes in this grid, and thus your painting performance will be greatly improved.</p><div class="tip"><strong>NOTE</strong>  If you split your mesh up then each individual mesh will now be using a smaller area of the UV data. To not waste texture memory you should modify each mesh so the UV data covers the whole texture area, or use the <b>Atlas</b> setup seen in the example scenes so they share the same texture.</div></div><br><br><br></div><div style="overflow:hidden;"><a name="Issues"></a><h2>Known Issues</h2><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style=""> _MainTex & URP/HDRP</span></h2><p>If you're using URP or HDRP, then you may notice painting <b>_MainTex</b> (Albedo) doesn't work, even though it shows up in the inspector list.</p><p>This is because these shaders seem to have a 'fake' _MainTex slot that doesn't do anything.</p><p>To fix this, you must instead paint the <b>_BaseMap</b>, which is the 'real' albedo texture.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Galaxy S6 / Mali-T760MP8</span></h2><p>This device can incorrectly paint on Android 7 with the OpenGL ES3 graphics API. Previously painted pixels are observed to randomly become transparent and otherwise change.</p><p>If you need to support this device:</p><div class="tip"><strong>Step 1</strong> Open the <b>"P3D Decal.cginc"</b> and <b>"P3D Sphere.cginc"</b> files in the <b>PaintCore/Required/Resources</b> folder.</div><div class="tip"><strong>Step 2</strong> In both files, comment out or delete this line: <b>discard;</b></div><p>This should allow you to paint properly again.</p><div class="tip"><strong>NOTE</strong>  This modification removes the ability to paint objects with overlapping UVs (e.g. the default Unity cube). Most well designed meshes shouldn't have overlapping UVs though, so this shouldn't be an issue.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">VR Tools</span></h2><p>While the painting features can work with any VR asset/toolkit, the Paint in 3D VR examples are only configured to work with Unity's legacy XR system.</p></div><br><br><br></div><div style="overflow:hidden;"><a name="CreatePresets"></a><h2>Can I Create New Paint Presets?</h2><p>Yes, you can find the existing presets in the <b>PaintCore/Extras/Presets</b> folder.</p><p>To make a new one I recommend you duplicate one of the existing ones, and change its settings to your liking.</p><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Paintable Textures</span></h2><p>Each preset has one or many <b>P3dPaintableTexture</b> components.</p><p>Each paintable texture's <b>Slot</b> setting is automatically set when using the <b>Paint in 3D</b> window, so you can leave it empty.</p><p>Each paintable texture must have its own <b>Group</b> setting, which defines the kind of texture it will paint. For example, if you have one paintable texture that targets the <b>"Occlusion (G)"</b> group, then this preset will allow you to paint occlusion textures.</p><div class="tip"><strong>NOTE</strong>  To understand how all the other paintable texture settings work I recommend you look at the in-game examples, because the settings are the same and they're more comprehensively covered there.</div></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style="">Paint Groups</span></h2><img style="float:right; clear:both;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbQAAAE9CAYAAABji5dWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAFdASURBVHhe7Z333xXF+b/zMrELSpUmIFVABUQEURTFCogUQZSmCCIKCCJg72KhqNh7770r9tgFEzW2xBhNTE8+Sf6D+XoN3/s4Z5ndc87znKed8/7hep3dmdnZmdk98957dnbun1155ZVOCCGEaOr8bN9lbzpRt4w86023+NrX3f333y+EEKIOuO+++yRo9cmDDz4YvRBCCCFqz8/Wr1/vRN1z19MfuFtvvTV6EYQQQtQeCVo9cvPNN0cvghBCiNojQatHJGhCiEqHd1lnnXWWmzZtmps+fbo7++yz3b333htNmwbp586d6ynl2KIE7cknn3RnnnmmO/744z1sExZLK9KRoAkhKh30YcaMGW7lypVu1apVbubMmV7UYmnT4PXMpEmTPLfddls0TYyCgrZ27Vp39NFH+4wffvhh99BDD/ltwq699troMcaIESPcK6+8Eo1rKF5//XX39ttvR+PqGgmaEKLaQNSw1GJxWaxZs8YTi0sjU9CwwkwlATEzQTNRy7LUmjdv7p5//vloXEMxatQod/7550fj6hoJmhCi2rj++uu9XsTisrjrrrs8sbg0MgUN09HEKw3SxI4FEzQsonnz5nkLb8qUKW7OnDlu3bp1uXQvv/yymz9/vps8ebJXc8LsmMcff9wdc8wxfqjzmWeeyR3z/vvvezOWMixdutS9++67m8SR37Jly3JxK1ascN26dXP77LOPW758eS4t471HHXWUW7RokXvrrbd8uJ0fc3f8+PHu2WefzeVfUyRoQohqoyaChpDR70MpopYpaIhIKF4WHoaRJjwmxASNYcftttvOTZgwwa1evdqNHTvW7bbbbj7NO++84zp27OiFh+HN3r17+7FXO2bfffd1l19+uRebVq1auRdffNEfN3LkSHfooYd6kxQxGjJkSO68xAHiSBn33HNPH87LSrYRVcZow7TkQ3ifPn3ce++958+/7bbbugMOOMBddNFF7rXXXsvlX1MkaEKISmbq1Kl5+hBCXOyYGI1e0H7xi1+4X/7ylz78gw8+cFtvvbV74403vOWzww47+HdbxGEhffjhh/6YzTbbLG9IE+GaPXu2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
|
||
|
<h2><span style=""> Paint Hits</span></h2><p>Paint hits are the high-level data used to paint your scene (e.g. the P3dHitScreen component sends hit data to components like P3dPaintDecal). Depending on the paint hit type, this just stores the world space position, rotation, seed, and other basic data.</p><p>This is the easiest data to send, but since the data is handled in world space and applied to everything in the scene, it's not suitable for moving objects.</p><p>To listen for paint hits you can create a new component and add it to the GameObject that has your P3dHit___ component. You can then implement any of the IHit___ interfaces, to get specific hit data. For example, the P3dHitScreen component can send point and line hit data, so you can implement the IHitPoint and IHitLine interfaces.</p><p>When a hit occurs, the HandleHitPoint and HandleHitLine and methods from these interfaces will be invoked. You can then store the given parameters to a file, or send it over the network.</p><div class="tip"><strong>NOTE</strong>  If your object moves then you may want to transform the position and rotation values to local space before storing/sending it.</div><p>Once this data is loaded/received, you can then broadcast it again using code like this:</p><p><pre>// Loop through all components that implement IHitPoint</p><p>foreach (var hitPoint in GetComponentsInChildren<IHitPoint>())</p><p>{</p><p> // Ignore this one so we don't recursively paint</p><p> if ((Object)hitPoint != this)</p><p> {</p><p> // Submit the hit point</p><p> hitPoint.HandleHitPoint(preview, priority, pressure, seed, position, rotation);</p><p> }</p><p>}</pre></p><div class="tip"><strong>NOTE</strong>  If your data was converted to local space, make sure you convert it to world space before performing this code.</div><p>You can see the <b>P3dPaintMultiplayer.cs</b> code for an example of this.</p></div><br><div style="padding-left:75px; overflow:hidden;"><br>
|
||
|
<h2><span style=""> Paint Commands</span></h2><p>Paint commands are the low-level data used to paint each individual paintable texture. These store everything about the paint that was applied (e.g. texture references), so it's not as simple to serialize it all.</p><p>To allow for de/serialization of this data, you must first provide unique hash codes to the <b>P3dModel</b>, <b>P3dPaintable</b>, and <b>P3dPaintableTexture</b> components. This is done via the <b>Advanced / Hash</b> setting.</p><div class="tip"><strong>NOTE</strong>  If these components are part of a prefab or spawned in-game then you must manually give them new hash values that are consistent with multiple runs on your game, or other network clients.</div><p>In addition to these hashes, you must provide hashes for all textures used by your paint commands. For example, if you use decal painting then the decal texture must have a hash.</p><p>Since the <b>Texture</b> class is made by Unity and can't be modified, you must assign a hash to a texture using the <b>P3dTextureHash</b> component. You can add this component to your scene, assign the texture, and assign a hash code.</p><p>You can now listen for paint commands using the static P3dPaintableTexture.OnAddCommandGlobal event, or the instance OnAddCommand event. These events will give you every paint command for a specific paintable texture.</p><div class="tip"><strong>NOTE</strong>  These paint commands are in world space. If your objects move then you should use its SpawnCopyLocal() method, where the Transform argument matches the GameObject the paintable texture is attached to.</div><div class="tip"><strong>NOTE</strong>  If you want to store the command and aren't using SpawnCopyLocal(), then you should use SpawnCopy() to get a copy of it.</div><p>The paint command can then be stored or sent over the network using JsonUtility serialization, or similar.</p><p>Once this data is loaded/received, you can apply it using your paintable texture component's AddCommand() method.</p><p>You can see the <b>P3dCommandSerialization.cs</b> code for an example of this.</p></div><br><br><br></div><div style="overflow:hidden;"><a name="Examples"></a><h2>What Examples Are Included?</h2><p>This is a list of the in-game example scenes and a description of what it shows.<div style="padding-left:20px;"><h3>Basic Setup</h3><p style="margin-top: 0px;">This shows you how the <b>Spaceship</b> GameObject can be made paintable. This is done by adding the <b>P3dPaintable</b>, <b>P3dMaterialCloner</b>, and <b>P3dPaintableTexture</b> components. You can then paint the spaceship using the mouse/finger with the <b>Paint</b> GameObject, which has the <b>P3dHitScreen</b> and <b>P3dPaintSphere</b> components. Keep in mind that <b>P3dHitScreen</b> uses raycasts, so your mesh must have a collider to work.</p></div><div style="padding-left:20px;"><h3>Seam Fixer</h3><p style="margin-top: 0px;">This shows you how to remove painting seams from your mesh using the <b>Seam Fixer</b> tool. Seams are caused by gaps/islands in the mesh UV data, which are usually present at the edges of complex meshes. To use the seam fixer, simply click the context menu button (⋮ icon) at the top right of your mesh inspector window. You can then select <b>Fix Seams (Paint in 3D)</b>, adjust the settings, and click <b>Generate</b>. You can double click the <b>Spaceship</b> GameObject's <b>MeshFilter.Mesh</b> setting to see it in action.</p></div><div style="padding-left:70px;"><h3>Auto Seam Fix</h3><p style="margin-top: 0px;">This shows you how to automatically fix seams in your mesh without using the <b>Seam Fixer</b> tool. This is done by changing the <b>P3dPaintable</b> component''s <b>Advanced / UseMesh</b> setting to <b>AutoSeamFix</b>. Keep in mind this mode doesn''t give you control over the seam fix settings (the defaults should be suitable for most meshes). Also keep in mind there will be a small performance hit the first time you paint your object when its seam fixed mesh is generated.</p></div><div s
|
||
|
<br><br>
|
||
|
<br><br>
|
||
|
<h1>Assets</h1>
|
||
|
<p>Here's a list of all my other assets, please check them out!</p><p>You can also view this list on <a href="https://CarlosWilkes.com/Get/Assets" target="_blank">my Asset Store page</a>.</p>
|
||
|
<div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanTouch" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/30111/icon" alt="Lean Touch" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanTouch"></a><h2>Lean Touch</h2>
|
||
|
<p>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!</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanTouchPlus" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/72356/icon" alt="Lean Touch+" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanTouchPlus"></a><h2>Lean Touch+</h2>
|
||
|
<p>Lean Touch+ is an extension to the popular Lean Touch asset, adding many more example scenes.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanLocalization" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/28504/icon" alt="Lean Localization" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanLocalization"></a><h2>Lean Localization</h2>
|
||
|
<p>Lean Localization is a localization library that's designed to be as simple to use as possible for both designers, and programmers.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanPool" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/35666/icon" alt="Lean Pool" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanPool"></a><h2>Lean Pool</h2>
|
||
|
<p>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.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanTransition" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/144107/icon" alt="Lean Transition" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanTransition"></a><h2>Lean Transition</h2>
|
||
|
<p>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.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanGUI" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/72138/icon" alt="Lean GUI" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanGUI"></a><h2>Lean GUI</h2>
|
||
|
<p>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.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanGUIShapes" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/69366/icon" alt="Lean GUI Shapes" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanGUIShapes"></a><h2>Lean GUI Shapes</h2>
|
||
|
<p>Lean GUI Shapes allows you to quickly add lines, rounded boxes, polygons, and much more to your GUI!</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanTexture" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/200591/icon" alt="Lean Texture" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanTexture"></a><h2>Lean Texture</h2>
|
||
|
<p>Lean Texture allows you quickly modify textures in your project with a range of filters, pack them together into channels, and much more!</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/LeanTexturePlus" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/200571/icon" alt="Lean Texture+" width="128" height="128" /></a></div>
|
||
|
<a name="GetLeanTexturePlus"></a><h2>Lean Texture+</h2>
|
||
|
<p>Lean Texture+ is an extension to Lean Texture, adding many new types of texture modification tools!</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/Spaceships" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/236290/icon" alt="CW Spaceships - Build & Destroy" width="128" height="128" /></a></div>
|
||
|
<a name="GetSpaceships"></a><h2>CW Spaceships</h2>
|
||
|
<p>Build your dream spaceship, and then have fun destroying it!</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/Spaceships" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/233531/icon" alt="CW Orbit - Modular Backgrounds" width="128" height="128" /></a></div>
|
||
|
<a name="GetOrbit"></a><h2>CW Orbit</h2>
|
||
|
<p>Take your space game to the next level with this collection of 8K background planets. Just drag and drop them in, and enjoy orbiting around them.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/Nebula" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/245103/icon" alt="CW Nebula - Modular Backgrounds" width="128" height="128" /></a></div>
|
||
|
<a name="GetNebula"></a><h2>CW Nebula</h2>
|
||
|
<p>Add stunning nebula backgrounds to your 3D space games with ease.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/GasGiant" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/246973/icon" alt="CW Gas Giant - Modular Backgrounds" width="128" height="128" /></a></div>
|
||
|
<a name="GetGasGiant"></a><h2>CW Gas Giant</h2>
|
||
|
<p>Add stunning gas giant backgrounds to your 3D space games with ease.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/Galaxy" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/247777/icon" alt="CW Galaxy - Modular Backgrounds" width="128" height="128" /></a></div>
|
||
|
<a name="GetGalaxy"></a><h2>CW Galaxy</h2>
|
||
|
<p>Add stunning galaxy backgrounds to your 3D space games with ease.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;">
<a href="https://CarlosWilkes.com/Get/Silhouette" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/257921/icon" alt="CW Silhouette - Modular Backgrounds" width="128" height="128" /></a></div>
|
||
|
<a name="GetSilhouette"></a><h2>CW Silhouette</h2>
|
||
|
<p>Add stunning silhouette backgrounds to your 3D space games with ease.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/Cosmos" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/265569/icon" alt="CW Cosmos - Modular Backgrounds" width="128" height="128" /></a></div>
|
||
|
<a name="GetCosmos"></a><h2>CW Cosmos</h2>
|
||
|
<p>Add stunning nebula and galaxy backgrounds to your 3D space games with ease.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/PaintIn3D" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/26286/icon" alt="Paint in 3D" width="128" height="128" /></a></div>
|
||
|
<a name="GetPaintIn3D"></a><h2>Paint in 3D</h2>
|
||
|
<p>Paint all your objects using <strong>Paint in 3D</strong> - 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!</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/FLOW" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/197014/icon" alt="FLOW" width="128" height="128" /></a></div>
|
||
|
<a name="GetFlow"></a><h2>FLOW</h2>
|
||
|
<p><strong>FLOW</strong> allows you to add large scale interactive fluids to your scene - all highly optimized using GPU acceleration.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/Destructible2D" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/18125/icon" alt="Destructible 2D" width="128" height="128" /></a></div>
|
||
|
<a name="GetDestructible2D"></a><h2>Destructible 2D</h2>
|
||
|
<p>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!</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/SpaceGraphicsToolkit" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/4160/icon" alt="Space Graphics Toolkit" width="128" height="128" /></a></div>
|
||
|
<a name="GetSpaceGraphicsToolkit"></a><h2>Space Graphics Toolkit</h2>
|
||
|
<p>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.</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/SpaceGraphicsPlanets" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/124578/icon" alt="Space Graphics Planets" width="128" height="128" /></a></div>
|
||
|
<a name="GetPlanetPack"></a><h2>Space Graphics Planets</h2>
|
||
|
<p>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).</p>
|
||
|
</div>
|
||
|
<br><div style="overflow:hidden;">
|
||
|
<div style="float: left; padding-right: 20px;"><a href="https://CarlosWilkes.com/Get/VolumetricAudio" target="_blank"><img src="https://api.assetstore.unity3d.com/affiliate/embed/package/17125/icon" alt="Volumetric Audio" width="128" height="128" /></a></div>
|
||
|
<a name="GetVolumetricAudio"></a><h2>Volumetric Audio</h2>
|
||
|
<p>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.</p>
|
||
|
</div>
|
||
|
<br>
|
||
|
<br><br>
|
||
|
<br><br>
|
||
|
<h1>Versions</h1>
|
||
|
<div style="overflow:hidden;"><a name="3.1.1"></a><h2>3.1.1</h2><p>Fixed shader error when building for Android,</p><br><br></div><div style="overflow:hidden;"><a name="3.1.0"></a><h2>3.1.0</h2><div class="tip"><strong>NOTE</strong>  This update includes file structure changes, so before installing you should delete the "PaintCore" folder.</div><p>Fixed normal map painting when <b>Normal Map Encoding</b> is set to <b>DXT5nm</b>.<br>Fixed <b>P3dHitScreen</b> painting bug with connected preview hits.<br>Fixed <b>P3dHitScreen</b> not showing clip connected preview hits.<br>Renamed <b>SlidingToolButton</b> to <b>ToolButton</b>.<br>Adding the <b>P3dHitScreen</b> component will automatically add the <b>P3dPointerMouse/Touch/Pen</b> components.</p><br><br></div><div style="overflow:hidden;"><a name="3.0.3"></a><h2>3.0.3</h2><p>Moved main build to Unity 2021.3.0f1.<br>Updated shaders to latest version.<br>Fixed <b>P3dCloneMirror</b> component when the <b>Flip</b> setting is enabled.<br>Fixed <b>P3dCoordCopier</b> index counts.<br>Fixed <b>P3d___Counter</b> components updating when not necessary.<br>Added <b>P3dRenderDepth</b> component.<br>Added <b>Advanced/DepthMask</b> setting to <b>P3dPaintSphere</b> component.<br>Added <b>Advanced/DepthMask</b> setting to <b>P3dPaintDecal</b> component.<br>Added <b>Depth Mask</b> demo scene.</p><br><br></div><div style="overflow:hidden;"><a name="3.0.2"></a><h2>3.0.2</h2><p>Updated shaders to latest version.</p><br><br></div><div style="overflow:hidden;"><a name="3.0.1"></a><h2>3.0.1</h2><p>Fixed <b>P3dHitScreen</b> component's <b>GuiLayers</b> setting.<br>Fixed <b>P3dHitScreenLine</b> component painting.<br>Fixed <b>P3dHitScreenFill</b> component painting.</p><br><br></div><div style="overflow:hidden;"><a name="3.0.0"></a><h2>3.0.0</h2><p><b>WARNING:</b> To update from an earlier version: back up your project, delete the old Plugins/CW/PaintIn3D folder, and then install the new version.<br>Moved main build to Unity 2020.3.0f1.<br>Moved in-editor painting features to Plugins/CW/PaintInEditor folder.<br>Fixed in-editor triangle painting.<br>Fixed manual disabling of <b>P3dPaintable</b> components.<br>Fixed in-editor painting not painting alpha.<br>Added <b>P3dPointerMouse</b> component.<br>Added <b>P3dPointerTouch</b> component.<br>Added <b>P3dPointerPen</b> component.<br>Added <b>AlphaFromAlbedo</b> setting to <b>P3dMaterial</b> component.<br>Added <b>Min</b> blending mode.<br>Added <b>Max</b> blending mode.<br>Added <b>Initial Tiling</b> demo scene.</p><br><br></div><div style="overflow:hidden;"><a name="2.0.4"></a><h2>2.0.4</h2><p>Moved main build to Unity 2020.3.0f1.<br>Fixed in-editor triangle painting.<br>Fixed manual disabling of <b>P3dPaintable</b> components.<br>Fixed in-editor painting not painting alpha.<br>Added <b>AlphaFromAlbedo</b> setting to <b>P3dMaterial</b> component.</p><br><br></div><div style="overflow:hidden;"><a name="2.0.3"></a><h2>2.0.3</h2><p>Fixed <b>P3dHitBetween</b> when <b>Orientation = WorldUp</b>.<br>Improved <b>P3dMask</b> component gizmo rendering.<br>Added <b>NormalReplaceOriginal</b> blending mode.<br>Added <b>NormalReplaceCustom</b> blending mode.<br>Fixed <b>P3dGraduallyFade</b> colors being incorrect during transition.<br>Added <b>Default Format</b> setting to <b>Config</b> tab of the Paint In 3D window.<br>Added unlit versions of the 4 main example shaders.</p><br><br></div><div style="overflow:hidden;"><a name="2.0.2"></a><h2>2.0.2</h2><p>Fixed connected hit painting on touch screen devices.<br>Added <b>Dynamic Mask</b> demo scene.</p><br><br></div><div style="overflow:hidden;"><a name="2.0.1"></a><h2>2.0.1</h2><p>Removed global shader keywords.<br>Fixed <b>P3dChannelCounter</b> component setting changes not being reflected.<br>Fixed <b>P3dChangeCounter</b> component setting changes not being reflected.<br>Fixed <b>P3dColorCounter</b> component setting changes not being reflected.<br>Every <b>P3dColorCounter</b> now updates when a <b>P3dColor</b> is enabled or disabled.<br>Fixed <b>P3dReadColor</b> reading incorrect UV location on the Metal
|
||
|
<br><br>
|
||
|
<br><br>
|
||
|
<h1>Components</h1>
|
||
|
<div style="overflow:hidden;"><a name="IClone"></a><h2>IClone</h2><p>This interface allows you to define classes that can clone paint points (e.g. mirror).</p><br><br></div><div style="overflow:hidden;"><a name="IHit"></a><h2>IHit</h2><p>All <b>IHit___</b> interfaces implement this interface so they can all be easily found with <b>GetComponent</b>.</p><br><br></div><div style="overflow:hidden;"><a name="IHitCoord"></a><h2>IHitCoord</h2><p>This interface allows you to make components that can paint points defined by UV coordinates.</p><div class="tip"><strong>NOTE</strong>  The <b>rotation</b> argument is in world space, where <b>Quaternion.identity</b> means the paint faces forward on the +Z axis, and up is +Y.</div><br><br></div><div style="overflow:hidden;"><a name="IHitLine"></a><h2>IHitLine</h2><p>This interface allows you to make components that can paint lines defined by two points.</p><br><br></div><div style="overflow:hidden;"><a name="IHitPoint"></a><h2>IHitPoint</h2><p>This interface allows you to make components that can paint 3D points with a specified orientation.</p><br><br></div><div style="overflow:hidden;"><a name="IHitQuad"></a><h2>IHitQuad</h2><p>This interface allows you to make components that can paint quads defined by a pair of two points.</p><br><br></div><div style="overflow:hidden;"><a name="IHitTriangle"></a><h2>IHitTriangle</h2><p>This interface allows you to make components that can paint triangles defined by three points.</p><br><br></div><div style="overflow:hidden;"><a name="P3dBlendMode"></a><h2>P3dBlendMode</h2><p>This defines the blending mode used by a painting operation.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Index</span>
|
||
|
</h2>
|
||
|
<p>This is the index of the currently selected blending mode.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>When using the <b>ReplaceCustom</b> blending mode, this allows you to specify the replacement color.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>When using the <b>ReplaceCustom</b> blending mode, this allows you to specify the replacement texture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Kernel</span>
|
||
|
</h2>
|
||
|
<p>When using the <b>Blur</b> or <b>Flow</b> blending modes, this allows you to set the maximum pixel distance of samples.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector4</b>
|
||
|
<br>
|
||
|
<span style="">Channels</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control which channels will be modified by this blending mode.</p><p>1,1,1,1 = All channels will be modified.</p><p>1,0,0,0 = Only red will be modified.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChangeCounter"></a><h2>P3dChangeCounter</h2><p>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.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dChangeCounter></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Threshold</span>
|
||
|
</h2>
|
||
|
<p>The RGBA values must be within this range of a color for it to be counted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>The texture we want to compare change to.</p><p>None/null = white.</p><div class="tip"><strong>NOTE</strong>  All pixels in this texture will be tinted by the current <b>Color</b>.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>The color we want to compare change to.</p><div class="tip"><strong>NOTE</strong>  All pixels in the <b>Texture</b> will be tinted by this.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Count</span>
|
||
|
</h2>
|
||
|
<p>The previously counted amount of pixels with a RGBA value difference above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Ratio</span>
|
||
|
</h2>
|
||
|
<p>The <b>Count / Total</b> value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetTotal</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChangeCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>Total</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetCount</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChangeCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>Count</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static float</b>
|
||
|
<br>
|
||
|
<span style="">GetRatio</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChangeCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>Ratio</b> of the specified counters.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChannelCounter"></a><h2>P3dChannelCounter</h2><p>This component will total up all RGBA channels in the specified P3dPaintableTexture that exceed the threshold value.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dChannelCounter></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Threshold</span>
|
||
|
</h2>
|
||
|
<p>The RGBA value must be higher than this for it to be counted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">CountR</span>
|
||
|
</h2>
|
||
|
<p>The previously counted amount of pixels with a red channel value above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">CountG</span>
|
||
|
</h2>
|
||
|
<p>The previously counted amount of pixels with a green channel value above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">CountB</span>
|
||
|
</h2>
|
||
|
<p>The previously counted amount of pixels with a blue channel value above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">CountA</span>
|
||
|
</h2>
|
||
|
<p>The previously counted amount of pixels with a alpha channel value above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">RatioR</span>
|
||
|
</h2>
|
||
|
<p>The <b>CountR/Total</b> value, allowing you to easily see how much % of the red channel is above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">RatioG</span>
|
||
|
</h2>
|
||
|
<p>The <b>CountG/Total</b> value, allowing you to easily see how much % of the green channel is above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">RatioB</span>
|
||
|
</h2>
|
||
|
<p>The <b>CountB/Total</b> value, allowing you to easily see how much % of the blue channel is above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">RatioA</span>
|
||
|
</h2>
|
||
|
<p>The <b>CountA/Total</b> value, allowing you to easily see how much % of the alpha channel is above the threshold.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector4</b>
|
||
|
<br>
|
||
|
<span style="">RatioRGBA</span>
|
||
|
</h2>
|
||
|
<p>The <b>RatioR/G/B/A</b> values packed into a Vector4.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetTotal</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>Total</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetCountR</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountR</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetCountG</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountG</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetCountB</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountB</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetCountA</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountA</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static float</b>
|
||
|
<br>
|
||
|
<span style="">GetRatioR</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountR / Total</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static float</b>
|
||
|
<br>
|
||
|
<span style="">GetRatioG</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountG / Total</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static float</b>
|
||
|
<br>
|
||
|
<span style="">GetRatioB</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountB / Total</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static float</b>
|
||
|
<br>
|
||
|
<span style="">GetRatioA</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>CountA / Total</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Vector4</b>
|
||
|
<br>
|
||
|
<span style="">GetRatioRGBA</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dChannelCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>GetCountR/G/B/A / GetTotal</b> of the specified counters stored in a Vector4.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dClone"></a><h2>P3dClone</h2><p>This is the base class for all components that repeat paint commands (e.g. mirroring).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dClone></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances in the open scenes.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dCloneMirror"></a><h2>P3dCloneMirror</h2><p>This component grabs paint hits and connected hits, mirrors the data, then re-broadcasts it.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Flip</span>
|
||
|
</h2>
|
||
|
<p>When a decal is mirrored it will appear backwards, should it be flipped back around?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dColor"></a><h2>P3dColor</h2><p>This component allows you to define a color that can later be counted from the <b>P3dColorCounter</b> component.</p><div class="tip"><strong>NOTE</strong>  You should put this component its own GameObject, so you can give it a unique name.</div><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>The color associated with this component and GameObject name.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dColor></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances in the open scenes.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Total</span>
|
||
|
</h2>
|
||
|
<p>This tells you how many pixels this color could be painted on.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Solid</span>
|
||
|
</h2>
|
||
|
<p>This tells you how many pixels this color has been painted on.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Ratio</span>
|
||
|
</h2>
|
||
|
<p>This is Solid/Total, allowing you to quickly see the percentage of paintable pixels that have been painted by this color.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dColorCounter"></a><h2>P3dColorCounter</h2><p>This component will search the specified paintable texture for pixel colors matching an active and enabled P3dColor.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dColorCounter></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Threshold</span>
|
||
|
</h2>
|
||
|
<p>The RGBA values must be within this range of a color for it to be counted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<Contribution></b>
|
||
|
<br>
|
||
|
<span style="">Contributions</span>
|
||
|
</h2>
|
||
|
<p>Each color contribution will be stored in this list.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetTotal</span>
|
||
|
<br>
|
||
|
<b>ICollection<P3dColorCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>Total</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static long</b>
|
||
|
<br>
|
||
|
<span style="">GetCount</span>
|
||
|
<br>
|
||
|
<b>P3dColor color, ICollection<P3dColorCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>Count</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static float</b>
|
||
|
<br>
|
||
|
<span style="">GetRatio</span>
|
||
|
<br>
|
||
|
<b>P3dColor color, ICollection<P3dColorCounter> counters = null</b>
|
||
|
</h2>
|
||
|
<p>The <b>Ratio</b> of the specified counters.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Count</span>
|
||
|
<br>
|
||
|
<b>P3dColor color</b>
|
||
|
</h2>
|
||
|
<p>This tells you how many pixels of the specified color are in the current <b>PaintableTexture</b>.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dCommand"></a><h2>P3dCommand</h2><p>This is the base class for all paint commands. These commands (e.g. paint decal) are added to the command list for each P3dPaintableTexture, and are executed at the end of the frame to optimize state changes.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Index</span>
|
||
|
</h2>
|
||
|
<p>This is the original array index, used to stable sort between two commands if they have the same priority.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Is this preview painting, or real painting?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Priority</span>
|
||
|
</h2>
|
||
|
<p>The draw order priority of this command for this frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dHashedMaterial</b>
|
||
|
<br>
|
||
|
<span style="">Material</span>
|
||
|
</h2>
|
||
|
<p>The hash of the Material used to apply this paint command.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Pass</span>
|
||
|
</h2>
|
||
|
<p>The material pass that will be used.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dHashedModel</b>
|
||
|
<br>
|
||
|
<span style="">Model</span>
|
||
|
</h2>
|
||
|
<p>The hash of the Model used to apply this paint command.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Submesh</span>
|
||
|
</h2>
|
||
|
<p>The mesh submesh that will be painted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dHashedTexture</b>
|
||
|
<br>
|
||
|
<span style="">LocalMaskTexture</span>
|
||
|
</h2>
|
||
|
<p>The LocalMask that will be used when painting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector4</b>
|
||
|
<br>
|
||
|
<span style="">LocalMaskChannel</span>
|
||
|
</h2>
|
||
|
<p>The channel of the LocalMaskTexture that will be used.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dCommon"></a><h2>P3dCommon</h2><p>This class contains some useful methods used by this asset.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">SaveBytes</span>
|
||
|
<br>
|
||
|
<b>string saveName, byte[] data, bool save = true</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to save a byte array to PlayerPrefs, and is used by the texture saving system.</p><p>If you want to save to files instead then just modify this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static byte[]</b>
|
||
|
<br>
|
||
|
<span style="">LoadBytes</span>
|
||
|
<br>
|
||
|
<b>string saveName</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to load a byte array from PlayerPrefs, and is used by the texture loading system.</p><p>If you want to save to files instead then just modify this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static bool</b>
|
||
|
<br>
|
||
|
<span style="">SaveExists</span>
|
||
|
<br>
|
||
|
<b>string saveName</b>
|
||
|
</h2>
|
||
|
<p>This method tells if you if there exists save data at the specified save name.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">ClearSave</span>
|
||
|
<br>
|
||
|
<b>string saveName, bool save = true</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to clear save data at the specified save name.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dCoordCopier"></a><h2>P3dCoordCopier</h2><p>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.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Mesh</b>
|
||
|
<br>
|
||
|
<span style="">Source</span>
|
||
|
</h2>
|
||
|
<p>The original mesh whose UV seams you want to fix.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Coord</b>
|
||
|
<br>
|
||
|
<span style="">First</span>
|
||
|
</h2>
|
||
|
<p>The coord that will be copied into the first UV channel of the output mesh.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Coord</b>
|
||
|
<br>
|
||
|
<span style="">Second</span>
|
||
|
</h2>
|
||
|
<p>The coord that will be copied into the second UV channel of the output mesh.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Coord</b>
|
||
|
<br>
|
||
|
<span style="">Third</span>
|
||
|
</h2>
|
||
|
<p>The coord that will be copied into the third UV channel of the output mesh.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Coord</b>
|
||
|
<br>
|
||
|
<span style="">Fourth</span>
|
||
|
</h2>
|
||
|
<p>The coord that will be copied into the fourth UV channel of the output mesh.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="CwEditorWindow"></a><h2>CwEditorWindow</h2><p>This is the base class for all Paint in 3D editor windows.</p><br><br></div><div style="overflow:hidden;"><a name="P3dGraduallyFade"></a><h2>P3dGraduallyFade</h2><p>This component allows you to fade the pixels of the specified P3dPaintableTexture.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPaintableTexture</b>
|
||
|
<br>
|
||
|
<span style="">PaintableTexture</span>
|
||
|
</h2>
|
||
|
<p>This allows you to choose which paintable texture will be modified by this component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Threshold</span>
|
||
|
</h2>
|
||
|
<p>Once this component has accumulated this amount of fade, it will be applied to the <b>PaintableTexture</b>. The lower this value, the smoother the fading will appear, but also the higher the performance cost.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Speed</span>
|
||
|
</h2>
|
||
|
<p>The speed of the fading.</p><p>1 = 1 Second.</p><p>2 = 0.5 Seconds.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dBlendMode</b>
|
||
|
<br>
|
||
|
<span style="">BlendMode</span>
|
||
|
</h2>
|
||
|
<p>This component will paint using this blending mode.</p><div class="tip"><strong>NOTE</strong>  See <b>P3dBlendMode</b> documentation for more information.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">BlendTexture</span>
|
||
|
</h2>
|
||
|
<p>The texture that will be faded toward.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPaintableTexture</b>
|
||
|
<br>
|
||
|
<span style="">BlendPaintableTexture</span>
|
||
|
</h2>
|
||
|
<p>The paintable texture that will be faded toward.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">BlendColor</span>
|
||
|
</h2>
|
||
|
<p>The color that will be faded toward.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">MaskTexture</span>
|
||
|
</h2>
|
||
|
<p>If you want the gradually fade effect to be masked by a texture, then specify it here.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPaintableTexture</b>
|
||
|
<br>
|
||
|
<span style="">MaskPaintableTexture</span>
|
||
|
</h2>
|
||
|
<p>If you want the gradually fade effect to be masked by a paintable texture, then specify it here.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dChannel</b>
|
||
|
<br>
|
||
|
<span style="">MaskChannel</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the channel of the mask.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dGroup"></a><h2>P3dGroup</h2><p>This struct allows you to specify a group index with a group dropdown selector.</p><br><br></div><div style="overflow:hidden;"><a name="P3dGroupData"></a><h2>P3dGroupData</h2><p>This object allows you to define information about a paint group like its name, which can then be selected using the <b>P3dGroup</b> setting on components like <b>P3dPaintableTexture</b> and <b>P3dPaintDecal</b>.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Index</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the ID of this group (e.g. 100).</p><div class="tip"><strong>NOTE</strong>  This number should be unique, and not shared by any other <b>P3dGroupData</b>.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<TextureData></b>
|
||
|
<br>
|
||
|
<span style="">TextureDatas</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the way each channel of this group's pixels are mapped to textures. This is mainly used by the in-editor painting material builder tool.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">ShaderData</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify which shaders and their properties are associated with this group.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static List<P3dGroupData></b>
|
||
|
<br>
|
||
|
<span style="">CachedInstances</span>
|
||
|
</h2>
|
||
|
<p>This static property returns a list of all cached <b>P3dGroupData</b> instances.</p><div class="tip"><strong>NOTE</strong>  This will be empty in-game.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">GetName</span>
|
||
|
<br>
|
||
|
<b>bool prefixNumber</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to get the <b>name</b> of the current group, with an optional prefix of the <b>Index</b> (e.g. "100: Albedo").</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static string</b>
|
||
|
<br>
|
||
|
<span style="">GetGroupName</span>
|
||
|
<br>
|
||
|
<b>int index, bool prefixNumber</b>
|
||
|
</h2>
|
||
|
<p>This static method calls <b>GetAlias</b> on the <b>P3dGroupData</b> with the specified <b>Index</b> setting, or null.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static P3dGroupData</b>
|
||
|
<br>
|
||
|
<span style="">GetGroupData</span>
|
||
|
<br>
|
||
|
<b>int index</b>
|
||
|
</h2>
|
||
|
<p>This static method returns the <b>P3dGroupData</b> with the specified <b>Index</b> setting, or null.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">UpdateCachedInstances</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This static method forces the cached instance list to update.</p><div class="tip"><strong>NOTE</strong>  This does nothing in-game.</div>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHashedMaterial"></a><h2>P3dHashedMaterial</h2><p>This struct can be used to reference a <b>Material</b> by instance or hash for de/serialization.</p><br><br></div><div style="overflow:hidden;"><a name="P3dHashedModel"></a><h2>P3dHashedModel</h2><p>This struct can be used to reference a <b>Material</b> by instance or hash for de/serialization.</p><div class="tip"><strong>NOTE</strong>  To support networking you must modify the <b>P3dSerialization.TryRegister(P3dModel)</b> method to register the model using a hash/id specific to your networking solution.</div><br><br></div><div style="overflow:hidden;"><a name="P3dHashedTexture"></a><h2>P3dHashedTexture</h2><p>This struct can be used to reference a <b>Texture</b> by instance or hash for de/serialization.</p><div class="tip"><strong>NOTE</strong>  For the de/serialization to work you must call the <b>P3dSerialization.TryRegister/TryUnregister</b> methods on your textures.</div><br><br></div><div style="overflow:hidden;"><a name="P3dHit"></a><h2>P3dHit</h2><p>This stores information about a scene point on a mesh. This is usually generated from a <b>RaycastHit</b>, but it can also be filled manually.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">Position</span>
|
||
|
</h2>
|
||
|
<p>The world position that was hit.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">Normal</span>
|
||
|
</h2>
|
||
|
<p>The world normal that was hit.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">Transform</span>
|
||
|
</h2>
|
||
|
<p>The Transform that was hit.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">TriangleIndex</span>
|
||
|
</h2>
|
||
|
<p>The triangle index that was hit.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Distance</span>
|
||
|
</h2>
|
||
|
<p>The world distance that was hit.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Collider</b>
|
||
|
<br>
|
||
|
<span style="">Collider</span>
|
||
|
</h2>
|
||
|
<p>The Collider that was hit.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dLineConnector"></a><h2>P3dLineConnector</h2><p>This class allows you to easily create components that can have their paint lines connected together to form quads.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">HitSpacing</span>
|
||
|
</h2>
|
||
|
<p>The world space distance between each paint point.</p><p>0 = No spacing.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">HitLimit</span>
|
||
|
</h2>
|
||
|
<p>When using <b>HitSpacing</b>, this prevents scenarios where something goes wrong and you attempt to paint too many times per frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">ConnectHits</span>
|
||
|
</h2>
|
||
|
<p>If you enable this then the hit lines generated by this component will be connected into quads, allowing you to paint continuously.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">ClipConnected</span>
|
||
|
</h2>
|
||
|
<p>If you enable <b>ConnectHits</b>, 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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ResetConnections</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If this GameObject has teleported and you have <b>ConnectHits</b> or <b>HitSpacing</b> enabled, then you can call this to prevent a quad being drawn between the previous and current lines.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dMask"></a><h2>P3dMask</h2><p>This component allows you to block paint from being applied at the current position using the specified shape.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>The mask will use this texture shape.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dChannel</b>
|
||
|
<br>
|
||
|
<span style="">Channel</span>
|
||
|
</h2>
|
||
|
<p>The mask will use pixels from this texture channel.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector2</b>
|
||
|
<br>
|
||
|
<span style="">Stretch</span>
|
||
|
</h2>
|
||
|
<p>If you want the sides of the mask to extend farther out, then this allows you to set the scale of the boundary.</p><p>1 = Default.</p><p>2 = Double size.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dMask></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances in the open scenes.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dMaterialCloner"></a><h2>P3dMaterialCloner</h2><p>This component allows you to duplicate a material before you paint on it. This is useful if the material is shared between multiple GameObjects (e.g. prefabs).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Index</span>
|
||
|
</h2>
|
||
|
<p>The material index that will be cloned. This matches the Materials list in your MeshRenderer/SkinnedMeshRenderer, where 0 is the first material.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Activated</span>
|
||
|
</h2>
|
||
|
<p>This lets you know if this component has already been activated and has executed.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Activate</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This allows you to manually activate this component, cloning the specified material.</p><div class="tip"><strong>NOTE</strong>  This will automatically be called from P3dPaintable to clone the material.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Deactivate</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This reverses the material cloning.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModel"></a><h2>P3dModel</h2><p>This component marks the current GameObject as being paintable, as long as this GameObject has a MeshFilter + MeshRenderer, or a SkinnedMeshRenderer.</p><div class="tip"><strong>NOTE</strong>  To actually paint, the <b>P3dPaintableTexture</b> component must be on a different object.</div><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPaintable</b>
|
||
|
<br>
|
||
|
<span style="">Paintable</span>
|
||
|
</h2>
|
||
|
<p>The paintable this separate paintable is associated with.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">IncludeScale</span>
|
||
|
</h2>
|
||
|
<p>Transform the mesh with its position, rotation, and scale? Some skinned mesh setups require this to be disabled.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UseMeshType</b>
|
||
|
<br>
|
||
|
<span style="">UseMesh</span>
|
||
|
</h2>
|
||
|
<p>This allows you to choose how the <b>Mesh</b> attached to the current <b>Renderer</b> is used when painting.</p><p>AsIs = Use what is currently set in the renderer.</p><p>AutoSeamFix = Use (or automatically generate) a seam-fixed version of the mesh currently set in the renderer.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dHash</b>
|
||
|
<br>
|
||
|
<span style="">Hash</span>
|
||
|
</h2>
|
||
|
<p>The hash code for this model used for de/serialization of this instance.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dModel></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances in the open scenes.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">DirtyMaterials</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>Materials will give you a cached CachedRenderer.sharedMaterials array. If you have updated this array externally then call this to force the cache to update next them it's accessed.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static List<P3dModel></b>
|
||
|
<br>
|
||
|
<span style="">FindOverlap</span>
|
||
|
<br>
|
||
|
<b>Vector3 position, float radius, int layerMask</b>
|
||
|
</h2>
|
||
|
<p>This will return a list of all paintables that overlap the specified bounds</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifier"></a><h2>P3dModifier</h2><p>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.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Should this modifier apply to preview paint as well?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Unique</span>
|
||
|
</h2>
|
||
|
<p>Should this modifier use a unique seed?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifierList"></a><h2>P3dModifierList</h2><p>This class maintains a list of <b>P3dModifier</b> instances, and contains helper methods to apply them.</p><p>This is used instead of a normal list so the modifiers can be de/serialized with polymorphism.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Count</span>
|
||
|
</h2>
|
||
|
<p>The amount of modifiers in the list.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dModifier></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all modifiers in this list.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintable"></a><h2>P3dPaintable</h2><p>This component marks the current GameObject as being paintable.</p><div class="tip"><strong>NOTE</strong>  This GameObject must has a MeshFilter + MeshRenderer, or a SkinnedMeshRenderer.</div><p>To actually paint your object, you must also add at least one <b>P3dPaintableTexture</b> component to specify which texture you want to paint.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ActivationType</b>
|
||
|
<br>
|
||
|
<span style="">Activation</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control when this component actually activates and becomes ready for painting. You probably don't need to change this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">BaseScale</span>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<Renderer></b>
|
||
|
<br>
|
||
|
<span style="">OtherRenderers</span>
|
||
|
</h2>
|
||
|
<p>If this material is used in multiple renderers, you can specify them here. This usually happens with different LOD levels.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnActivating</span>
|
||
|
</h2>
|
||
|
<p>This event will be invoked before this component is activated.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnActivated</span>
|
||
|
</h2>
|
||
|
<p>This event will be invoked after this component is activated.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnDeactivating</span>
|
||
|
</h2>
|
||
|
<p>This event will be invoked before this component is deactivated.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnDeactivated</span>
|
||
|
</h2>
|
||
|
<p>This event will be invoked after this component is deactivated.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Activated</span>
|
||
|
</h2>
|
||
|
<p>This lets you know if this paintable has been activated.</p><p>Being activated means each associated P3dMaterialCloner and P3dPaintableTexture has been Activated.</p><div class="tip"><strong>NOTE</strong>  If you manually add P3dMaterialCloner or P3dPaintableTexture components after activation, then you must manually Activate().</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">HashSet<P3dPaintableTexture></b>
|
||
|
<br>
|
||
|
<span style="">PaintableTextures</span>
|
||
|
</h2>
|
||
|
<p>This gives you all P3dPaintableTexture components that have been activated.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">RemoveComponents</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will remove all <b>P3dPaintable</b>, <b>P3dMaterialCloner</b>, and <b>P3dPaintableTexture</b> components from this GameObject.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ScaleSize</span>
|
||
|
<br>
|
||
|
<b>ref int width, ref int height</b>
|
||
|
</h2>
|
||
|
<p>This will scale the specified width and height values based on the current BaseScale setting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Activate</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This allows you to manually activate all attached P3dMaterialCloner and P3dPaintableTexture components.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Deactivate</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This reverses the material cloning.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearAll</span>
|
||
|
<br>
|
||
|
<b>Color color</b>
|
||
|
</h2>
|
||
|
<p>This allows you to clear the pixels of all activated P3dPaintableTexture components associated with this P3dPaintable with the specified color.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearAll</span>
|
||
|
<br>
|
||
|
<b>Texture texture, Color color</b>
|
||
|
</h2>
|
||
|
<p>This allows you to clear the pixels of all activated P3dPaintableTexture components associated with this P3dPaintable with the specified color and texture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Register</span>
|
||
|
<br>
|
||
|
<b>P3dPaintableTexture paintableTexture</b>
|
||
|
</h2>
|
||
|
<p>This allows you to manually register a P3dPaintableTexture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Unregister</span>
|
||
|
<br>
|
||
|
<b>P3dPaintableTexture paintableTexture</b>
|
||
|
</h2>
|
||
|
<p>This allows you to manually unregister a P3dPaintableTexture.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintableManager"></a><h2>P3dPaintableManager</h2><p>This component automatically updates all P3dModel and P3dPaintableTexture instances at the end of the frame, batching all paint operations together.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dPaintableManager></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances in the open scenes.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintableState"></a><h2>P3dPaintableState</h2><p>This class stores information about a particular paintable texture state. Either a full texture copy, or a list of commands used to draw it.</p><br><br></div><div style="overflow:hidden;"><a name="P3dPaintableTexture"></a><h2>P3dPaintableTexture</h2><p>This component allows you to make one texture on the attached Renderer paintable.</p><div class="tip"><strong>NOTE</strong>  If the texture or texture slot you want to paint is part of a shared material (e.g. prefab material), then I recommend you add the P3dMaterialCloner component to make it unique.</div><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dSlot</b>
|
||
|
<br>
|
||
|
<span style="">Slot</span>
|
||
|
</h2>
|
||
|
<p>The material index and shader texture slot name that this component will paint.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dCoord</b>
|
||
|
<br>
|
||
|
<span style="">Coord</span>
|
||
|
</h2>
|
||
|
<p>The UV channel this texture is mapped to.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dGroup</b>
|
||
|
<br>
|
||
|
<span style="">Group</span>
|
||
|
</h2>
|
||
|
<p>The group you want to associate this texture with. Only painting components with a matching group can paint this texture. This allows you to paint multiple textures at the same time with different settings (e.g. Albedo + Normal).</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UndoRedoType</b>
|
||
|
<br>
|
||
|
<span style="">UndoRedo</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set how this texture's state is stored, allowing you to perform undo and redo operations.</p><p>FullTextureCopy = A full copy of your texture will be copied for each state. This allows you to quickly undo and redo, and works with animated skinned meshes, but it uses up a lot of texture memory.</p><p>LocalCommandCopy = Each paint command will be stored in local space for each state. This allows you to perform unlimited undo and redo states with minimal memory usage, because the object will be repainted from scratch. However, performance will depend on how many states must be redrawn, and it may not work well with skinned meshes.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">StateLimit</span>
|
||
|
</h2>
|
||
|
<p>The amount of times this texture can have its paint operations undone.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">SaveLoadType</b>
|
||
|
<br>
|
||
|
<span style="">SaveLoad</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control how this texture is loaded and saved.</p><p>Manual = You must manually call <b>Save(SaveName)</b> and <b>Load(SaveName)</b> from code.</p><p>Automatic = <b>Save(SaveName)</b> is called in <b>Deactivate/OnDestroy</b>, and <b>Load(SaveName)</b> is called in <b>Activate</b>.</p><p>SemiManual = You can manually call the <b>Save()</b> and <b>Load()</b> methods from code or editor event, and the current <b>SaveName</b> will be used.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">SaveName</span>
|
||
|
</h2>
|
||
|
<p>If you want this texture to automatically save & load, then you can set the unique save name for it here.</p><div class="tip"><strong>NOTE</strong>  This name should be unique, so this setting won't work properly with prefab spawning since all clones will share the same <b>SaveName</b>.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Width</span>
|
||
|
</h2>
|
||
|
<p>The base width of the created texture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Height</span>
|
||
|
</h2>
|
||
|
<p>The base height of the created texture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>When activated or cleared, this paintable texture will be given this texture, and then multiplied/tinted by the <b>Color</b>.</p><p>None = White.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>When activated or cleared, this paintable texture will be given this color.</p><div class="tip"><strong>NOTE</strong>  If <b>Texture</b> is set, then each pixel RGBA value will be multiplied/tinted by this color.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">RenderTextureFormat</b>
|
||
|
<br>
|
||
|
<span style="">Format</span>
|
||
|
</h2>
|
||
|
<p>The format of the created texture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">MipType</b>
|
||
|
<br>
|
||
|
<span style="">MipMaps</span>
|
||
|
</h2>
|
||
|
<p>The <b>useMipMap</b> mode of the created texture.</p><p>Auto = Copied from the <b>Texture</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">FilterType</b>
|
||
|
<br>
|
||
|
<span style="">Filter</span>
|
||
|
</h2>
|
||
|
<p>The <b>filterMode</b> of the created texture.</p><p>Auto = Copied from the <b>Texture</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">AnisoType</b>
|
||
|
<br>
|
||
|
<span style="">Aniso</span>
|
||
|
</h2>
|
||
|
<p>The <b>anisoLevel</b> of the created texture.</p><p>Auto = Copied from the <b>Texture</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">WrapType</b>
|
||
|
<br>
|
||
|
<span style="">WrapU</span>
|
||
|
</h2>
|
||
|
<p>The <b>wrapModeU</b> mode of the created texture.</p><p>Auto = Copied from the <b>Texture</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">WrapType</b>
|
||
|
<br>
|
||
|
<span style="">WrapV</span>
|
||
|
</h2>
|
||
|
<p>The wrapModeV of the created texture.</p><p>Auto = Copied from the <b>Texture</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ExistingType</b>
|
||
|
<br>
|
||
|
<span style="">Existing</span>
|
||
|
</h2>
|
||
|
<p>If this component's <b>Texture</b> setting is none/null but the <b>Slot</b> texture is not none/null when this component activates, what should happen?</p><p>Ignore = Nothing will happen.</p><p>Use = This paintable texture will activate with the <b>Slot</b> texture.</p><p>UseAndKeep = The same as <b>Use</b>, but the <b>Slot</b> texture will also be stored in the <b>Texture</b> setting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ConversionType</b>
|
||
|
<br>
|
||
|
<span style="">Conversion</span>
|
||
|
</h2>
|
||
|
<p>If you're painting special textures then they may need to be converted before use.</p><p>Normal = Convert texture to be a normal map.</p><p>Premultiply = Premultiply the RGB values.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">LocalMaskTexture</span>
|
||
|
</h2>
|
||
|
<p>This allows you to restrict painting to specific areas.</p><div class="tip"><strong>NOTE</strong>  This mask texture should match the UV mapping of the texture itself.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dChannel</b>
|
||
|
<br>
|
||
|
<span style="">LocalMaskChannel</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify which channel from the <b>LocalMaskTexture</b> texture will be used.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">ShaderKeyword</span>
|
||
|
</h2>
|
||
|
<p>Some shaders require specific shader keywords to be enabled when adding new textures. If there is no texture in your selected slot then you may need to set this keyword.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dHash</b>
|
||
|
<br>
|
||
|
<span style="">Hash</span>
|
||
|
</h2>
|
||
|
<p>The hash code for this model used for de/serialization of this instance.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">IsDummy</span>
|
||
|
</h2>
|
||
|
<p>If you want to paint a texture but don't want it to be applied to the specified material texture slot, then enable this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">Output</span>
|
||
|
</h2>
|
||
|
<p>When you export this texture as a PNG asset from the in-editor painting window, the exported texture's GUID will be stored here so you can easily re-export it to the same file.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">event System.Action<P3dCommand></b>
|
||
|
<br>
|
||
|
<span style="">OnAddCommand</span>
|
||
|
</h2>
|
||
|
<p>This event is called after a paint command has been added to this texture. These commands will be executed at the end of the frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static event System.Action<P3dPaintableTexture, P3dCommand></b>
|
||
|
<br>
|
||
|
<span style="">OnAddCommandGlobal</span>
|
||
|
</h2>
|
||
|
<p>This event is called after a paint command has been added to this texture. These commands will be executed at the end of the frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static System.Action<P3dPaintableTexture></b>
|
||
|
<br>
|
||
|
<span style="">OnInstanceAdded</span>
|
||
|
</h2>
|
||
|
<p>This is invoked every time a paintable texture component is enabled.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static System.Action<P3dPaintableTexture></b>
|
||
|
<br>
|
||
|
<span style="">OnInstanceRemoved</span>
|
||
|
</h2>
|
||
|
<p>This is invoked every time a paintable texture component is disabled.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">event System.Action<bool></b>
|
||
|
<br>
|
||
|
<span style="">OnModified</span>
|
||
|
</h2>
|
||
|
<p>This event is called after this texture has been painted, allowing you to perform actions like counting the pixels after modification.</p><p>Bool = Preview painting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dPaintableTexture></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances in the open scenes.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Activated</span>
|
||
|
</h2>
|
||
|
<p>This lets you know if this texture is activated and ready for painting. Activation is controlled by the associated P3dPaintable component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">CanUndo</span>
|
||
|
</h2>
|
||
|
<p>This lets you know if there is at least one undo state this texture can be undone into.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">CanRedo</span>
|
||
|
</h2>
|
||
|
<p>This lets you know if there is at least one redo state this texture can be redone into.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dPaintableState></b>
|
||
|
<br>
|
||
|
<span style="">States</span>
|
||
|
</h2>
|
||
|
<p>This property returns a list of all stored undo/redo states.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">StateIndex</span>
|
||
|
</h2>
|
||
|
<p>This tells you which undo/redo state is currently active inside the <b>States</b> list.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Material</b>
|
||
|
<br>
|
||
|
<span style="">Material</span>
|
||
|
</h2>
|
||
|
<p>This tells you which material this paintable texture is currently stored in.</p><div class="tip"><strong>NOTE</strong>  You may have to call <b>UpdateMaterial</b> if this is out of date.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPaintable</b>
|
||
|
<br>
|
||
|
<span style="">Paintable</span>
|
||
|
</h2>
|
||
|
<p>This quickly gives you the P3dPaintable component associated with this paintable texture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">RenderTexture</b>
|
||
|
<br>
|
||
|
<span style="">Current</span>
|
||
|
</h2>
|
||
|
<p>This gives you the current state of this paintable texture.</p><div class="tip"><strong>NOTE</strong>  This will only exist if your texture is activated.</div><div class="tip"><strong>NOTE</strong>  This is a <b>RenderTexture</b>, so you can't directly read it. Use the <b>GetReadableCopy()</b> method if you need to.</div><div class="tip"><strong>NOTE</strong>  This doesn't include any preview painting information, access the Preview property if you need to.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">RenderTexture</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>This gives you the current state of this paintable texture including any preview painting information.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">CommandsPending</span>
|
||
|
</h2>
|
||
|
<p>This lets you know if there are paint commands in this paintable texture's paint stack.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static List<P3dPaintableTexture></b>
|
||
|
<br>
|
||
|
<span style="">FilterAll</span>
|
||
|
<br>
|
||
|
<b>P3dModel model, P3dGroup group</b>
|
||
|
</h2>
|
||
|
<p>This allows you to get a list of all paintable textures on a P3dModel/P3dPaintable with the specified group.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearStates</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This will clear all undo/redo texture states.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">StoreState</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This will store a texture state so that it can later be undone. This should be called before you perform texture modifications.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Undo</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This will revert the texture to a previous state, if you have an undo state stored.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Redo</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This will restore a previously undone texture state, if you've performed an undo.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">SetColor</span>
|
||
|
<br>
|
||
|
<b>string html</b>
|
||
|
</h2>
|
||
|
<p>This allows you to set the <b>Color</b> based on an HTML style string (#FFF, #FF0055, yellow, red)</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">NotifyOnModified</span>
|
||
|
<br>
|
||
|
<b>bool preview</b>
|
||
|
</h2>
|
||
|
<p>You should call this after painting this paintable texture.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture2D</b>
|
||
|
<br>
|
||
|
<span style="">GetReadableCopy</span>
|
||
|
<br>
|
||
|
<b>bool convertBack = false</b>
|
||
|
</h2>
|
||
|
<p>This method returns a <b>Texture2D</b> copy of the current texture state, allowing you to read pixel values, etc.</p><div class="tip"><strong>NOTE</strong>  This method can be slow if your texture is large.</div><div class="tip"><strong>NOTE</strong>  A new texture is allocated each time you call this, so you must manually delete it when finished.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">byte[]</b>
|
||
|
<br>
|
||
|
<span style="">GetPngData</span>
|
||
|
<br>
|
||
|
<b>bool convertBack = false</b>
|
||
|
</h2>
|
||
|
<p>This method returns the current texture state as a PNG byte array.</p><div class="tip"><strong>NOTE</strong>  This method can be slow if your texture is large.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">byte[]</b>
|
||
|
<br>
|
||
|
<span style="">GetTgaData</span>
|
||
|
<br>
|
||
|
<b>bool convertBack = false</b>
|
||
|
</h2>
|
||
|
<p>This method returns the current texture state as a TGA byte array.</p><div class="tip"><strong>NOTE</strong>  This method can be slow if your texture is large.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Clear</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will clear the current texture state with the current <b>Texture</b> and <b>Color</b> values.</p><div class="tip"><strong>NOTE</strong>  This component must be activated, and this method will not resize the current texture.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Clear</span>
|
||
|
<br>
|
||
|
<b>Texture texture, Color tint, bool updateMips = true</b>
|
||
|
</h2>
|
||
|
<p>This method will clear the current texture state with the specified texture and color.</p><div class="tip"><strong>NOTE</strong>  This component must be activated, and this method will not resize the current texture.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Replace</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will replace the current texture state with the current <b>Texture</b> and <b>Color</b> values, including size.</p><div class="tip"><strong>NOTE</strong>  This component must be activated</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Replace</span>
|
||
|
<br>
|
||
|
<b>Texture texture, Color tint</b>
|
||
|
</h2>
|
||
|
<p>This method will resize the current texture state based on the specified texture, and then replace its contents with the specified texture and color.</p><div class="tip"><strong>NOTE</strong>  This component must be activated.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Resize</span>
|
||
|
<br>
|
||
|
<b>int width, int height, bool copyContents = true</b>
|
||
|
</h2>
|
||
|
<p>This method will resize the current texture state with the specified width and height.</p><div class="tip"><strong>NOTE</strong>  This component must be activated.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Save</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will save the current texture state to PlayerPrefs using the current <b>SaveName</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Save</span>
|
||
|
<br>
|
||
|
<b>string saveName</b>
|
||
|
</h2>
|
||
|
<p>This will save the current texture state with the specified save name.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Load</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will replace the current texture state with the data saved at <b>SaveName</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Load</span>
|
||
|
<br>
|
||
|
<b>string saveName, bool replace = true</b>
|
||
|
</h2>
|
||
|
<p>This method will replace the current texture state with the data saved at the specified save name.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">LoadFromData</span>
|
||
|
<br>
|
||
|
<b>byte[] data, bool allowResize = true</b>
|
||
|
</h2>
|
||
|
<p>This method will replace the current texture state with the specified image data (e.g. png).</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">HidePreview</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If you last painted using preview painting and you want to hide the preview painting, you can call this method to force the texture to go back to its current state.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">HideAllPreviews</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This automatically calls <b>HidePreview</b> on all active and enabled paintable textures.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearSave</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This will clear save data with the current <b>SaveName</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">ClearSave</span>
|
||
|
<br>
|
||
|
<b>string saveName</b>
|
||
|
</h2>
|
||
|
<p>This will clear save data with the specified save name.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">UpdateMaterial</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If you modified the slot material index, then call this to update the cached material.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">CopySize</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If the current slot has a texture, this allows you to copy the width and height from it.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">CopyTexture</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This copies the texture from the current slot.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Activate</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This allows you to manually activate this paintable texture.</p><div class="tip"><strong>NOTE</strong>  This will automatically be called by the associated P3dPaintable component when it activates.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">AddCommand</span>
|
||
|
<br>
|
||
|
<b>P3dCommand command</b>
|
||
|
</h2>
|
||
|
<p>This will add a paint command to this texture's paint stack. The paint stack will be executed at the end of the current frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ExecuteCommands</span>
|
||
|
<br>
|
||
|
<b>bool sendNotifications, bool doSort</b>
|
||
|
</h2>
|
||
|
<p>This allows you to manually execute all commands in the paint stack.</p><p>This is useful if you need to modify the state of your object before the end of the frame.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintableTextureMonitor"></a><h2>P3dPaintableTextureMonitor</h2><p>This base class allows you to quickly create components that listen for changes to the specified <b>P3dPaintableTexture</b>.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPaintableTexture</b>
|
||
|
<br>
|
||
|
<span style="">PaintableTexture</span>
|
||
|
</h2>
|
||
|
<p>This is the paintable texture whose pixels we will count.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Interval</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the minimum delay between each texture read in seconds.</p><p>0 = Instant.</p><p>1 = Once a second.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Async</span>
|
||
|
</h2>
|
||
|
<p>If you disable this, then the texture will be updated immediately, which may cause slowdown.</p><div class="tip"><strong>NOTE</strong>  This isn't supported on all devices.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">DownsampleSteps</span>
|
||
|
</h2>
|
||
|
<p>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.</p><div class="tip"><strong>NOTE</strong>  The pixel totals will be multiplied to account for this downsampling.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">event System.Action</b>
|
||
|
<br>
|
||
|
<span style="">OnUpdated</span>
|
||
|
</h2>
|
||
|
<p>This event is invoked each time this texture monitor updates its pixel counts.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Registered</span>
|
||
|
</h2>
|
||
|
<p>This will be true after Register is successfully called.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Register</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This forces the specified P3dPaintableTexture to be registered.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Unregister</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This forces the specified P3dPaintableTexture to be unregistered.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintableTextureMonitorMask"></a><h2>P3dPaintableTextureMonitorMask</h2><p>This base class allows you to quickly create components that listen for changes to the specified P3dPaintableTexture.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Mesh</b>
|
||
|
<br>
|
||
|
<span style="">MaskMesh</span>
|
||
|
</h2>
|
||
|
<p>If you want this component to accurately count pixels relative to a mask mesh, then specify it here.</p><div class="tip"><strong>NOTE</strong>  For best results this should be the original mesh, NOT the seam-fixed version.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">MaskSubmesh</span>
|
||
|
</h2>
|
||
|
<p>If you have a <b>MaskMesh</b> set, then this allows you to choose which submesh of it will be used for the mask.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">MaskTexture</span>
|
||
|
</h2>
|
||
|
<p>If you want this component to accurately count pixels relative to a mask texture, then specify it here.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dChannel</b>
|
||
|
<br>
|
||
|
<span style="">MaskChannel</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify which channel of the <b>MaskTexture</b> will be used to define the mask.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Total</span>
|
||
|
</h2>
|
||
|
<p>The previously counted total amount of pixels.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPointConnector"></a><h2>P3dPointConnector</h2><p>This class allows you to easily create components that can have their paint points connected together to form lines.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">HitSpacing</span>
|
||
|
</h2>
|
||
|
<p>The world space distance between each paint point.</p><p>0 = No spacing.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">HitLimit</span>
|
||
|
</h2>
|
||
|
<p>When using <b>HitSpacing</b>, this prevents scenarios where something goes wrong and you attempt to paint too many times per frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">ConnectHits</span>
|
||
|
</h2>
|
||
|
<p>If you enable this then the hit points generated by this component will be connected into lines, allowing you to paint continuously.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">ClipConnected</span>
|
||
|
</h2>
|
||
|
<p>If you enable <b>ConnectHits</b>, 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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ResetConnections</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If this GameObject has teleported and you have <b>ConnectHits</b> or <b>HitSpacing</b> enabled, then you can call this to prevent a line being drawn between the previous and current points.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dReadColor"></a><h2>P3dReadColor</h2><p>This component allows you to read the paint color at a hit point. A hit point can be found using a companion component like: P3dHitScreen, P3dHitBetween.</p><div class="tip"><strong>NOTE</strong>  This component only works when you hit a non-convex MeshCollider that has UV data.</div><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dGroup</b>
|
||
|
<br>
|
||
|
<span style="">Group</span>
|
||
|
</h2>
|
||
|
<p>Only the <b>P3dPaintableTexture</b> components with a matching group will be painted by this component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Should the color be read during preview painting too?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ReadType</b>
|
||
|
<br>
|
||
|
<span style="">Read</span>
|
||
|
</h2>
|
||
|
<p>How should the texture be read?</p><p>Immediate = The reading method will block until the pixel is fetched from the GPU.</p><p>Async = The pixel value will be read after some time, giving you better performance.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>The last read color value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ColorEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnColor</span>
|
||
|
</h2>
|
||
|
<p>When a color is read, this event will be invoked.</p><p>Color = The color that was read.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dReader"></a><h2>P3dReader</h2><p>This class allows you to read the contents of a <b>RenderTexture</b> immediately or async.</p><br><br></div><div style="overflow:hidden;"><a name="P3dRenderDepth"></a><h2>P3dRenderDepth</h2><p>This component renders scene depth to a RenderTexture. This scene depth can be set in a <b>P3dPaint___</b> component's <b>Advanced/DepthMask</b> setting, which allows you to paint on the first surface in the view of the specified camera.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Camera</b>
|
||
|
<br>
|
||
|
<span style="">SourceCamera</span>
|
||
|
</h2>
|
||
|
<p>The camera whose depth information will be read.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Matrix4x4</b>
|
||
|
<br>
|
||
|
<span style="">SourceMatrix</span>
|
||
|
</h2>
|
||
|
<p>The transformation matrix of the camera when the depth texture was generated.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">RenderTexture</b>
|
||
|
<br>
|
||
|
<span style="">TargetTexture</span>
|
||
|
</h2>
|
||
|
<p>The RenderTexture where the depth information will be stored.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">ResizeAndDownscale</span>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Bias</span>
|
||
|
</h2>
|
||
|
<p>The rendered depth must be at least this mant units different from the painted surface for the paint to be masked out.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">ReadInStart</span>
|
||
|
</h2>
|
||
|
<p>Should the scene depth be rendered in <b>Start</b>?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">ReadInUpdate</span>
|
||
|
</h2>
|
||
|
<p>Should the scene depth be rendered every frame in <b>Update</b>?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ReadNow</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will update the <b>TargetTexture</b> with what the <b>SourceCamera</b> currently sees.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dSerialization"></a><h2>P3dSerialization</h2><p>This class handles the low level de/serialization of different paint in 3D objects to allow for things like networking.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<int, Material></b>
|
||
|
<br>
|
||
|
<span style="">HashToMaterial</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>Material</b> hash code and the <b>Material</b> instance, so it can be de/serialized.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<Material, int></b>
|
||
|
<br>
|
||
|
<span style="">MaterialToHash</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>Material</b> instance and the <b>Material</b> hash code, so it can be de/serialized.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<P3dHash, P3dModel></b>
|
||
|
<br>
|
||
|
<span style="">HashToModel</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>P3dModel</b> hash code and the <b>P3dModel</b> instance, so it can be de/serialized.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<P3dModel, P3dHash></b>
|
||
|
<br>
|
||
|
<span style="">ModelToHash</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>P3dModel</b> instance and the <b>P3dModel</b> hash code, so it can be de/serialized.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<P3dHash, Texture></b>
|
||
|
<br>
|
||
|
<span style="">HashToTexture</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>Texture</b> hash code and the <b>Texture</b> instance, so it can be de/serialized.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<Texture, P3dHash></b>
|
||
|
<br>
|
||
|
<span style="">TextureToHash</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>Texture</b> instance and the <b>Texture</b> hash code, so it can be de/serialized.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<P3dHash, P3dPaintableTexture></b>
|
||
|
<br>
|
||
|
<span style="">HashToPaintableTexture</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>P3dModel</b> hash code and the <b>P3dModel</b> instance, so it can be de/serialized.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static Dictionary<P3dPaintableTexture, P3dHash></b>
|
||
|
<br>
|
||
|
<span style="">PaintableTextureToHash</span>
|
||
|
</h2>
|
||
|
<p>This stores an association between a <b>P3dModel</b> instance and the <b>P3dModel</b> hash code, so it can be de/serialized.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dSlot"></a><h2>P3dSlot</h2><p>This struct stores a reference to a texture on a GameObject.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Index</span>
|
||
|
</h2>
|
||
|
<p>The material index in the attached renderer.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">Name</span>
|
||
|
</h2>
|
||
|
<p>The name of the texture in the specified material.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dStateManager"></a><h2>P3dStateManager</h2><p>This component allows you to manage undo/redo states on all P3dPaintableTextures in your scene.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">StoreAllStates</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will call StoreState on all active and enabled P3dPaintableTextures.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">ClearAllStates</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will call StoreState on all active and enabled P3dPaintableTextures.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">UndoAll</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will call Undo on all active and enabled P3dPaintableTextures.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">RedoAll</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will call Redo on all active and enabled P3dPaintableTextures.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dTextureHash"></a><h2>P3dTextureHash</h2><p>This component allows you to manually associate a <b>Texture</b> with a hash code so it can be de/serialized.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>The texture that will be hashed.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dHash</b>
|
||
|
<br>
|
||
|
<span style="">Hash</span>
|
||
|
</h2>
|
||
|
<p>The hash code for the texture.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dCommandFill"></a><h2>P3dCommandFill</h2><p>This class manages the fill painting command.</p><br><br></div><div style="overflow:hidden;"><a name="P3dCommandReplace"></a><h2>P3dCommandReplace</h2><p>This class manages the replace painting command.</p><br><br></div><div style="overflow:hidden;"><a name="P3dCommandReplaceChannels"></a><h2>P3dCommandReplaceChannels</h2><p>This class manages the replace channels painting command.</p><br><br></div><div style="overflow:hidden;"><a name="P3dHitBetween"></a><h2>P3dHitBetween</h2><p>This component raycasts between two points, and fires hit events when the ray hits something.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">PhaseType</b>
|
||
|
<br>
|
||
|
<span style="">PaintIn</span>
|
||
|
</h2>
|
||
|
<p>Where in the game loop should this component hit?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Interval</span>
|
||
|
</h2>
|
||
|
<p>The time in seconds between each raycast.</p><p>0 = Every frame.</p><p>-1 = Manual only.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">PointA</span>
|
||
|
</h2>
|
||
|
<p>The start point of the raycast.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">PointB</span>
|
||
|
</h2>
|
||
|
<p>The end point of the raycast.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Fraction</span>
|
||
|
</h2>
|
||
|
<p>The end point of the raycast.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">Layers</span>
|
||
|
</h2>
|
||
|
<p>The layers you want the raycast to hit.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">OrientationType</b>
|
||
|
<br>
|
||
|
<span style="">Orientation</span>
|
||
|
</h2>
|
||
|
<p>How should the hit point be oriented?</p><p>WorldUp = It will be rotated to the normal, where the up vector is world up.</p><p>CameraUp = It will be rotated to the normal, where the up vector is world up.</p><p>ThisRotation = The current <b>Transform.rotation</b> will be used.</p><p>ThisLocalRotation = The current <b>Transform.localRotation</b> will be used.</p><p>CustomRotation = The specified <b>CustomTransform.rotation</b> will be used.</p><p>CustomLocalRotation = The specified <b>CustomTransform.localRotation</b> will be used.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Camera</b>
|
||
|
<br>
|
||
|
<span style="">Camera</span>
|
||
|
</h2>
|
||
|
<p>Orient to a specific camera?</p><p>None = MainCamera.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">CustomTransform</span>
|
||
|
</h2>
|
||
|
<p>If you use <b>Orientation = CustomRotation/CustomLocalRotation</b>, this allows you to set the transform.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">NormalType</b>
|
||
|
<br>
|
||
|
<span style="">Normal</span>
|
||
|
</h2>
|
||
|
<p>Which normal should the hit point rotation be based on?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Offset</span>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Should the applied paint be applied as a preview?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Priority</span>
|
||
|
</h2>
|
||
|
<p>This allows you to override the order this paint gets applied to the object during the current frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Pressure</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the pressure of the painting. This could be controlled by a VR trigger or similar for more advanced effects.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">EmitType</b>
|
||
|
<br>
|
||
|
<span style="">Draw</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the hit data this component sends out.</p><p>PointsIn3D = Point drawing in 3D.</p><p>PointsOnUV = Point drawing on UV (requires non-convex <b>MeshCollider</b>).</p><p>TrianglesIn3D = Triangle drawing in 3D.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">Point</span>
|
||
|
</h2>
|
||
|
<p>If you want to display something at the hit point (e.g. particles), you can specify the Transform here.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LineRenderer</b>
|
||
|
<br>
|
||
|
<span style="">Line</span>
|
||
|
</h2>
|
||
|
<p>If you want to draw a line between the start point and the his point then you can set the line here.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPointConnector</b>
|
||
|
<br>
|
||
|
<span style="">Connector</span>
|
||
|
</h2>
|
||
|
<p>This allows you to connect the hit points together to form lines.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ManuallyHitNow</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will immediately submit a non-preview hit. This can be used to apply real paint to your objects.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ResetConnections</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If this GameObject has teleported and you have <b>ConnectHits</b> or <b>HitSpacing</b> enabled, then you can call this to prevent a line being drawn between the previous and current points.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitCache"></a><h2>P3dHitCache</h2><p>This class stores lists of IHit__ instances, allowing components like P3dHit__ to easily invoke hit events.</p><br><br></div><div style="overflow:hidden;"><a name="P3dHitCollisions"></a><h2>P3dHitCollisions</h2><p>This component can be added to any Rigidbody, and it will fire hit events when it hits something.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">EmitType</b>
|
||
|
<br>
|
||
|
<span style="">Emit</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the hit data this component sends out.</p><p>PointsIn3D = Point drawing in 3D.</p><p>PointsOnUV = Point drawing on UV (requires non-convex <b>MeshCollider</b>).</p><p>TrianglesIn3D = Triangle drawing in 3D.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">RaycastDistance</span>
|
||
|
</h2>
|
||
|
<p>When emitting <b>PointsOnUV</b> or <b>TrianglesIn3D</b>, this setting allows you to specify the world space distance from the hit point a raycast will be fired. This is necessary because collisions by themselves don't provide the necessary information.</p><div class="tip"><strong>NOTE</strong>  Performing this raycast has a slight performance penalty.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">Layers</span>
|
||
|
</h2>
|
||
|
<p>This allows you to filter collisions to specific layers.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">OnlyUseFirstContact</span>
|
||
|
</h2>
|
||
|
<p>If there are multiple contact points, skip them?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Delay</span>
|
||
|
</h2>
|
||
|
<p>If this component is generating too many hits, then you can use this setting to ignore hits for the specified amount of seconds.</p><p>0 = Unlimited.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">OrientationType</b>
|
||
|
<br>
|
||
|
<span style="">Orientation</span>
|
||
|
</h2>
|
||
|
<p>How should the hit point be oriented?</p><p>WorldUp = It will be rotated to the normal, where the up vector is world up.</p><p>CameraUp = It will be rotated to the normal, where the up vector is world up.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Camera</b>
|
||
|
<br>
|
||
|
<span style="">Camera</span>
|
||
|
</h2>
|
||
|
<p>Orient to a specific camera?</p><p>None = MainCamera.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Should the applied paint be applied as a preview?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Threshold</span>
|
||
|
</h2>
|
||
|
<p>If the collision impact speed is below this value, then the collision will be ignored.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">PressureType</b>
|
||
|
<br>
|
||
|
<span style="">PressureMode</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set how the pressure value will be calculated.</p><p>Constant = The <b>PressureConstant</b> value will be directly used.</p><p>ImpactSpeed = The pressure will be 0 when the collision impact speed is <b>PressureMin</b>, and 1 when the impact speed is or exceeds <b>PressureMax</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMin</span>
|
||
|
</h2>
|
||
|
<p>The impact strength required for a hit to occur with a pressure of 0.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMax</span>
|
||
|
</h2>
|
||
|
<p>The impact strength required for a hit to occur with a pressure of 1.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureConstant</span>
|
||
|
</h2>
|
||
|
<p>The pressure value used when <b>PressureMode</b> is set to <b>Constant</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMultiplier</span>
|
||
|
</h2>
|
||
|
<p>The calculated pressure value will be multiplied by this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Offset</span>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Priority</span>
|
||
|
</h2>
|
||
|
<p>This allows you to override the order this paint gets applied to the object during the current frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">GameObject</b>
|
||
|
<br>
|
||
|
<span style="">Root</span>
|
||
|
</h2>
|
||
|
<p>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 <b>P3dHitCollisions</b> components with different settings and results.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitNearby"></a><h2>P3dHitNearby</h2><p>This component continuously fires hit events using the current Transform position.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">PhaseType</b>
|
||
|
<br>
|
||
|
<span style="">PaintIn</span>
|
||
|
</h2>
|
||
|
<p>Where in the game loop should this component hit?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Interval</span>
|
||
|
</h2>
|
||
|
<p>The time in seconds between each hit.</p><p>0 = Every frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Should the applied paint be applied as a preview?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Priority</span>
|
||
|
</h2>
|
||
|
<p>This allows you to override the order this paint gets applied to the object during the current frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Pressure</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the pressure of the painting. This could be controlled by a VR trigger or similar for more advanced effects.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPointConnector</b>
|
||
|
<br>
|
||
|
<span style="">Connector</span>
|
||
|
</h2>
|
||
|
<p>This allows you to connect the hit points together to form lines.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ManuallyHitNow</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will immediately submit a non-preview hit. This can be used to apply real paint to your objects.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ResetConnections</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If this GameObject has teleported and you have <b>ConnectHits</b> or <b>HitSpacing</b> enabled, then you can call this to prevent a line being drawn between the previous and current points.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitParticles"></a><h2>P3dHitParticles</h2><p>This component can be added to any ParticleSystem with collisions enabled, and it will fire hits when the particles collide with something.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">EmitType</b>
|
||
|
<br>
|
||
|
<span style="">Emit</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the hit data this component sends out.</p><p>PointsIn3D = Point drawing in 3D.</p><p>PointsOnUV = Point drawing on UV (requires non-convex <b>MeshCollider</b>).</p><p>TrianglesIn3D = Triangle drawing in 3D.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">RaycastDistance</span>
|
||
|
</h2>
|
||
|
<p>When emitting <b>PointsOnUV</b> or <b>TrianglesIn3D</b>, this setting allows you to specify the world space distance from the hit point a raycast will be fired. This is necessary because particles by themselves don't provide the necessary information.</p><div class="tip"><strong>NOTE</strong>  Performing this raycast has a slight performance penalty.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">Layers</span>
|
||
|
</h2>
|
||
|
<p>This allows you to filter collisions to specific layers.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">OrientationType</b>
|
||
|
<br>
|
||
|
<span style="">Orientation</span>
|
||
|
</h2>
|
||
|
<p>How should the hit point be oriented?</p><p>WorldUp = It will be rotated to the normal, where the up vector is world up.</p><p>CameraUp = It will be rotated to the normal, where the up vector is world up.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Camera</b>
|
||
|
<br>
|
||
|
<span style="">Camera</span>
|
||
|
</h2>
|
||
|
<p>Orient to a specific camera?</p><p>None = MainCamera.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">NormalType</b>
|
||
|
<br>
|
||
|
<span style="">Normal</span>
|
||
|
</h2>
|
||
|
<p>Which normal should the hit point rotation be based on?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Offset</span>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Skip</span>
|
||
|
</h2>
|
||
|
<p>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.</p><p>0 = Every particle will hit.</p><p>5 = Skip 5 particles, then hit using the 6th.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Should the particles paint preview paint?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Priority</span>
|
||
|
</h2>
|
||
|
<p>This allows you to override the order this paint gets applied to the object during the current frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">PressureType</b>
|
||
|
<br>
|
||
|
<span style="">PressureMode</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set how the pressure value will be calculated.</p><p>Constant = The <b>PressureConstant</b> value will be directly used.</p><p>Distance = A value will be calculated based on the distance between this emitter and the particle hit point.</p><p>Speed = A value will be calculated based on the hit speed of the particle.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMin</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the distance/speed that gives 0.0 pressure.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMax</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the distance/speed that gives 1.0 pressure.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureConstant</span>
|
||
|
</h2>
|
||
|
<p>The pressure value used when <b>PressureMode</b> is set to <b>Constant</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMultiplier</span>
|
||
|
</h2>
|
||
|
<p>The calculated pressure value will be multiplied by this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">GameObject</b>
|
||
|
<br>
|
||
|
<span style="">Root</span>
|
||
|
</h2>
|
||
|
<p>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 <b>P3dHitParticles</b> components with different settings and results.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitScreen"></a><h2>P3dHitScreen</h2><p>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 <b>P3dPaintDecal</b>, allowing you to paint the scene.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">FrequencyType</b>
|
||
|
<br>
|
||
|
<span style="">Frequency</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control how often the screen is painted.</p><p>PixelInterval = Once every <b>Interval</b> pixels.</p><p>ScaledPixelInterval = Like <b>PixelInterval</b>, but scaled to the screen DPI.</p><p>TimeInterval = Once every <b>Interval</b> seconds.</p><p>OnceOnRelease = When the finger/mouse goes down a preview will be shown, and when it goes up the paint will apply.</p><p>OnceOnPress = When the finger/mouse goes down the paint will apply.</p><p>OnceEveryFrame = Every frame the paint will apply.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Interval</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the pixels/seconds between each hit point based on the current <b>Frequency</b> setting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPointConnector</b>
|
||
|
<br>
|
||
|
<span style="">Connector</span>
|
||
|
</h2>
|
||
|
<p>This allows you to connect the hit points together to form lines.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ResetConnections</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If this GameObject has teleported and you have <b>ConnectHits</b> or <b>HitSpacing</b> enabled, then you can call this to prevent a line being drawn between the previous and current points.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitScreenBase"></a><h2>P3dHitScreenBase</h2><p>This class contains common code for screen based mouse/finger hit components.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Camera</b>
|
||
|
<br>
|
||
|
<span style="">Camera</span>
|
||
|
</h2>
|
||
|
<p>Orient to a specific camera?</p><p>None = MainCamera.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">Layers</span>
|
||
|
</h2>
|
||
|
<p>The layers you want the raycast to hit.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">GuiLayers</span>
|
||
|
</h2>
|
||
|
<p>Fingers that began touching the screen on top of these UI layers will be ignored.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">EmitType</b>
|
||
|
<br>
|
||
|
<span style="">Emit</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the hit data this component sends out.</p><p>PointsIn3D = Point drawing in 3D.</p><p>PointsOnUV = Point drawing on UV (requires non-convex <b>MeshCollider</b>).</p><p>TrianglesIn3D = Triangle drawing in 3D (requires non-convex <b>MeshCollider</b>).</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">RotationType</b>
|
||
|
<br>
|
||
|
<span style="">RotateTo</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control how the paint is rotated.</p><p>Normal = The rotation will be based on a normal direction, and rolled relative to an up axis.</p><p>World = The rotation will be aligned to the world, or given no rotation.</p><p>ThisRotation = The current <b>Transform.rotation</b> will be used.</p><p>ThisLocalRotation = The current <b>Transform.localRotation</b> will be used.</p><p>CustomRotation = The specified <b>CustomTransform.rotation</b> will be used.</p><p>CustomLocalRotation = The specified <b>CustomTransform.localRotation</b> will be used.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">DirectionType</b>
|
||
|
<br>
|
||
|
<span style="">NormalDirection</span>
|
||
|
</h2>
|
||
|
<p>Which direction should the hit point rotation be based on?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">RelativeType</b>
|
||
|
<br>
|
||
|
<span style="">NormalRelativeTo</span>
|
||
|
</h2>
|
||
|
<p>Based on the normal direction, what should the rotation be rolled relative to?</p><p>WorldUp = It will be rolled so the up vector is world up.</p><p>CameraUp = It will be rolled so the up vector is camera up.</p><p>DrawAngle = It will be rolled according to the mouse/finger movement on screen.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">CustomTransform</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the <b>Transform</b> when using <b>RotateTo = CustomRotation/CustomLocalRotation</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">StoreStates</span>
|
||
|
</h2>
|
||
|
<p>Should painting triggered from this component be eligible for being undone?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Priority</span>
|
||
|
</h2>
|
||
|
<p>This allows you to override the order this paint gets applied to the object during the current frame.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitScreenFill"></a><h2>P3dHitScreenFill</h2><p>This component works like <b>P3dHitScreen</b>, but it will fill in the shape you draw.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">FillSpacing</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the pixel distance between each grid point.</p><div class="tip"><strong>NOTE</strong>  The lower you set this, the lower the performance will be.</div>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitScreenLine"></a><h2>P3dHitScreenLine</h2><p>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 <b>P3dPaintDecal</b>, allowing you to paint the scene.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">FrequencyType</b>
|
||
|
<br>
|
||
|
<span style="">Frequency</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control how many hit points will be generated along the drawn line.</p><p>StartAndEnd = Once at the start, and once at the end.</p><p>PixelInterval = Once at the start, and then every <b>Interval</b> pixels.</p><p>ScaledPixelInterval = Once at the start, and then every <b>Interval</b> scaled pixels.</p><p>StretchedPixelInterval = Like <b>ScaledPixelInterval</b>, but the hits are stretched to reach the end.</p><p>StretchedScaledPixelInterval = Like <b>ScaledPixelInterval</b>, but the hits are stretched to reach the end.</p><p>Once = Once at the specified <b>Position</b> and <b>PixelOffset</b> along the line.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Interval</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the pixels between each hit point based on the current <b>Frequency</b> setting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Position</span>
|
||
|
</h2>
|
||
|
<p>When using <b>Frequency = Once</b>, this allows you to set the 0..1 position along the line.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PixelOffset</span>
|
||
|
</h2>
|
||
|
<p>When using <b>Frequency = Once</b>, this allows you to set the pixel offset along the line.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dPointConnector</b>
|
||
|
<br>
|
||
|
<span style="">Connector</span>
|
||
|
</h2>
|
||
|
<p>This allows you to connect the hit points together to form lines.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ResetConnections</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If this GameObject has teleported and you have <b>ConnectHits</b> or <b>HitSpacing</b> enabled, then you can call this to prevent a line being drawn between the previous and current points.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dHitThrough"></a><h2>P3dHitThrough</h2><p>This component constantly draws lines between the two specified points.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">PhaseType</b>
|
||
|
<br>
|
||
|
<span style="">PaintIn</span>
|
||
|
</h2>
|
||
|
<p>Where in the game loop should this component hit?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Interval</span>
|
||
|
</h2>
|
||
|
<p>The time in seconds between each hit.</p><p>0 = Every frame.</p><p>-1 = Manual only.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">PointA</span>
|
||
|
</h2>
|
||
|
<p>The start point of the raycast.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">PointB</span>
|
||
|
</h2>
|
||
|
<p>The end point of the raycast.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">OrientationType</b>
|
||
|
<br>
|
||
|
<span style="">Orientation</span>
|
||
|
</h2>
|
||
|
<p>How should the hit point be oriented?</p><p>WorldUp = It will be rotated to the normal, where the up vector is world up.</p><p>CameraUp = It will be rotated to the normal, where the up vector is world up.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Camera</b>
|
||
|
<br>
|
||
|
<span style="">Camera</span>
|
||
|
</h2>
|
||
|
<p>Orient to a specific camera?</p><p>None = MainCamera.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Pressure</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the pressure of the painting. This could be controlled by a VR trigger or similar for more advanced effects.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>Should the applied paint be applied as a preview?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">Priority</span>
|
||
|
</h2>
|
||
|
<p>This allows you to override the order this paint gets applied to the object during the current frame.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LineRenderer</b>
|
||
|
<br>
|
||
|
<span style="">Line</span>
|
||
|
</h2>
|
||
|
<p>If you want to draw a line between the start point and the his point then you can set the line here.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dLineConnector</b>
|
||
|
<br>
|
||
|
<span style="">Connector</span>
|
||
|
</h2>
|
||
|
<p>This allows you to connect the hit points together to form lines.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ManuallyHitNow</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will immediately submit a non-preview hit. This can be used to apply real paint to your objects.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ClearHitCache</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>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.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">ResetConnections</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If this GameObject has teleported and you have <b>ConnectHits</b> or <b>HitSpacing</b> enabled, then you can call this to prevent a line being drawn between the previous and current points.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dMeshAnalysis"></a><h2>P3dMeshAnalysis</h2><p>This window allows you to examine the UV data of a mesh. This can be accessed from the context menu (⋮ button at top right) of any mesh in the inspector.</p><br><br></div><div style="overflow:hidden;"><a name="P3dPreset"></a><h2>P3dPreset</h2><p>This component allows you to define a set of <b>P3dPaintableTexture</b> and <b>P3dMaterial</b> components that are configured for a specific set of Materials.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">Title</span>
|
||
|
</h2>
|
||
|
<p>This allows you to name this preset.</p><p>None/null = The GameObject name will be used.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">AddMaterialCloner</span>
|
||
|
</h2>
|
||
|
<p>Automatically add the <b>P3dMaterialCloner</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static List<P3dPreset></b>
|
||
|
<br>
|
||
|
<span style="">CachedPresets</span>
|
||
|
</h2>
|
||
|
<p>This gives you a list of all presets in the project.</p><div class="tip"><strong>NOTE</strong>  This is editor-only.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Targets</span>
|
||
|
<br>
|
||
|
<b>Shader target</b>
|
||
|
</h2>
|
||
|
<p>This method returns true if this preset is designed for the specified shader.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">AddTo</span>
|
||
|
<br>
|
||
|
<b>P3dPaintable paintable, Shader shader, int index, int stateLimit</b>
|
||
|
</h2>
|
||
|
<p>This method applies the preset components to the specified paintable.</p><div class="tip"><strong>NOTE</strong>  This is editor-only.</div>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dSeamFixer"></a><h2>P3dSeamFixer</h2><p>This tool allows you to convert a normal mesh with UV seams to a fixed mesh without UV seams.</p><p>This tool can be accessed from the context menu (⋮ button at top right) of any mesh/model inspector.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Mesh</b>
|
||
|
<br>
|
||
|
<span style="">Source</span>
|
||
|
</h2>
|
||
|
<p>The original mesh.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Mesh</b>
|
||
|
<br>
|
||
|
<span style="">Output</span>
|
||
|
</h2>
|
||
|
<p>The mesh with fixed seams.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<Pair></b>
|
||
|
<br>
|
||
|
<span style="">Meshes</span>
|
||
|
</h2>
|
||
|
<p>The meshes we will fix the seams of.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dCoord</b>
|
||
|
<br>
|
||
|
<span style="">Coord</span>
|
||
|
</h2>
|
||
|
<p>The UV channel whose seams will be fixed.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Threshold</span>
|
||
|
</h2>
|
||
|
<p>The threshold below which vertex UV coordinates will be snapped.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Border</span>
|
||
|
</h2>
|
||
|
<p>The thickness of the UV borders in the fixed mesh.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static float</b>
|
||
|
<br>
|
||
|
<span style="">DebugScale</span>
|
||
|
</h2>
|
||
|
<p>If this is above 0 then Debug.Lines will be output during generation.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">AddMesh</span>
|
||
|
<br>
|
||
|
<b>Mesh mesh</b>
|
||
|
</h2>
|
||
|
<p>This allows you to add a mesh to the seam fixer.</p><div class="tip"><strong>NOTE</strong>  You must later call <b>Generate</b> to seam fix the added meshes.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">Generate</span>
|
||
|
<br>
|
||
|
<b>Mesh source, Mesh output, P3dCoord coord, float threshold, float border</b>
|
||
|
</h2>
|
||
|
<p>This static method allows you to fix the seams of the source mesh at runtime.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyAngleRandom"></a><h2>P3dModifyAngleRandom</h2><p>This class allows you to randomize the painting angle of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Min</span>
|
||
|
</h2>
|
||
|
<p>This is the minimum random angle that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Max</span>
|
||
|
</h2>
|
||
|
<p>This is the maximum random angle that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>The way the picked angle value will be blended with the current one.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyColorRandom"></a><h2>P3dModifyColorRandom</h2><p>This class allows you to randomize the painting color of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Gradient</b>
|
||
|
<br>
|
||
|
<span style="">Gradient</span>
|
||
|
</h2>
|
||
|
<p>This is the gradient containing all the possible colors. A color will be randomly picked from this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>The way the picked color value will be blended with the current one.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyHardnessPressure"></a><h2>P3dModifyHardnessPressure</h2><p>This class allows you to change the painting hardness based on the paint pressure.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Hardness</span>
|
||
|
</h2>
|
||
|
<p>The paint component's <b>Hardness</b> value will be modified using this value based on the current <b>Blend</b> setting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control how this new <b>Hardness</b> value will modify the old value in the paint component.</p><p>Replace = Transition between [old, new] based on pressure.</p><p>Multiply = Transition between [old, old*new] based on pressure.</p><p>Increment = Transition between [old, old+new] based on pressure.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyHardnessRandom"></a><h2>P3dModifyHardnessRandom</h2><p>This class allows you to randomize the painting hardness of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Min</span>
|
||
|
</h2>
|
||
|
<p>This is the minimum random hardness that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Max</span>
|
||
|
</h2>
|
||
|
<p>This is the maximum random hardness that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>The way the picked hardness value will be blended with the current one.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyOpacityPressure"></a><h2>P3dModifyOpacityPressure</h2><p>This class allows you to change the painting opacity based on the paint pressure.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Opacity</span>
|
||
|
</h2>
|
||
|
<p>The paint component's <b>Opacity</b> value will be modified using this value based on the current <b>Blend</b> setting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control how this new <b>Opacity</b> value will modify the old value in the paint component.</p><p>Replace = Transition between [old, new] based on pressure.</p><p>Multiply = Transition between [old, old*new] based on pressure.</p><p>Increment = Transition between [old, old+new] based on pressure.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyOpacityRandom"></a><h2>P3dModifyOpacityRandom</h2><p>This class allows you to randomize the painting opacity of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Min</span>
|
||
|
</h2>
|
||
|
<p>This is the minimum random opacity that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Max</span>
|
||
|
</h2>
|
||
|
<p>This is the maximum random opacity that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>The way the picked opacity value will be blended with the current one.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyPositionRandom"></a><h2>P3dModifyPositionRandom</h2><p>This class allows you to randomize the painting position of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Radius</span>
|
||
|
</h2>
|
||
|
<p>The position will be offset up to this radius away in world space.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyRadiusPressure"></a><h2>P3dModifyRadiusPressure</h2><p>This class allows you to change the painting radius based on the paint pressure.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Radius</span>
|
||
|
</h2>
|
||
|
<p>The paint component's <b>Radius</b> value will be modified using this value based on the current <b>Blend</b> setting.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control how this new <b>Radius</b> value will modify the old value in the paint component.</p><p>Replace = Transition between [old, new] based on pressure.</p><p>Multiply = Transition between [old, old*new] based on pressure.</p><p>Increment = Transition between [old, old+new] based on pressure.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyRadiusRandom"></a><h2>P3dModifyRadiusRandom</h2><p>This class allows you to randomize the painting radius of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Min</span>
|
||
|
</h2>
|
||
|
<p>This is the minimum random radius that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Max</span>
|
||
|
</h2>
|
||
|
<p>This is the maximum random radius that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>The way the picked radius value will be blended with the current one.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyScaleRandom"></a><h2>P3dModifyScaleRandom</h2><p>This class allows you to randomize the painting scale of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">Min</span>
|
||
|
</h2>
|
||
|
<p>This is the minimum random scale that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">Max</span>
|
||
|
</h2>
|
||
|
<p>This is the maximum random scale that will be picked.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">BlendType</b>
|
||
|
<br>
|
||
|
<span style="">Blend</span>
|
||
|
</h2>
|
||
|
<p>The way the picked scale value will be blended with the current one.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Uniform</span>
|
||
|
</h2>
|
||
|
<p>If you disable this then each x, y, and z value will be scaled separately.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyTexturePressure"></a><h2>P3dModifyTexturePressure</h2><p>This class allows you to change the painting texture of the attached component (e.g. P3dPaintDecal) based on the paint pressure.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>The painting texture will be changed to this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMin</span>
|
||
|
</h2>
|
||
|
<p>The paint pressure must be at least this value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PressureMax</span>
|
||
|
</h2>
|
||
|
<p>The paint pressure must be at most this value.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dModifyTextureRandom"></a><h2>P3dModifyTextureRandom</h2><p>This class allows you to randomize the painting texture of the attached component (e.g. P3dPaintDecal).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<Texture></b>
|
||
|
<br>
|
||
|
<span style="">Textures</span>
|
||
|
</h2>
|
||
|
<p>A random texture will be picked from this list.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintFill"></a><h2>P3dPaintFill</h2><p>This component implements the fill paint mode, which will modify all pixels in the specified texture in the same way.</p><p>This is useful if you want to gradually fade a texture to a specific color.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dGroup</b>
|
||
|
<br>
|
||
|
<span style="">Group</span>
|
||
|
</h2>
|
||
|
<p>Only the <b>P3dPaintableTexture</b> components with a matching group will be painted by this component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dBlendMode</b>
|
||
|
<br>
|
||
|
<span style="">BlendMode</span>
|
||
|
</h2>
|
||
|
<p>This allows you to choose how the paint from this component will combine with the existing pixels of the textures you paint.</p><div class="tip"><strong>NOTE</strong>  See the <b>Blend Mode</b> section of the documentation for more information.</div>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>The color of the paint.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>The color of the paint.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Opacity</span>
|
||
|
</h2>
|
||
|
<p>The opacity of the brush.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Minimum</span>
|
||
|
</h2>
|
||
|
<p>The minimum RGBA value change. This is useful if you're doing very subtle color changes over time.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dModifierList</b>
|
||
|
<br>
|
||
|
<span style="">Modifiers</span>
|
||
|
</h2>
|
||
|
<p>This stores a list of all modifiers used to change the way this component applies paint (e.g. <b>P3dModifyColorRandom</b>).</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">IncrementOpacity</span>
|
||
|
<br>
|
||
|
<b>float delta</b>
|
||
|
</h2>
|
||
|
<p>This method increments <b>Opacity</b> by the specified value.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintReplace"></a><h2>P3dPaintReplace</h2><p>This component implements the replace paint mode, which will replace all pixels in the specified texture.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dGroup</b>
|
||
|
<br>
|
||
|
<span style="">Group</span>
|
||
|
</h2>
|
||
|
<p>Only the <b>P3dPaintableTexture</b> components with a matching group will be painted by this component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Texture</b>
|
||
|
<br>
|
||
|
<span style="">Texture</span>
|
||
|
</h2>
|
||
|
<p>The texture that will be painted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>The color of the paint.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dModifierList</b>
|
||
|
<br>
|
||
|
<span style="">Modifiers</span>
|
||
|
</h2>
|
||
|
<p>This stores a list of all modifiers used to change the way this component applies paint (e.g. <b>P3dModifyColorRandom</b>).</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintReplaceChannels"></a><h2>P3dPaintReplaceChannels</h2><p>This component implements the replace channels paint mode, which will replace all pixels in the specified textures and channel weights.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dGroup</b>
|
||
|
<br>
|
||
|
<span style="">Group</span>
|
||
|
</h2>
|
||
|
<p>Only the <b>P3dPaintableTexture</b> components with a matching group will be painted by this component.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPointer"></a><h2>P3dPointer</h2><p>This this is the base class for any component that sends pointer information to any <b>P3dHitScreen</b> component.</p><br><br></div><div style="overflow:hidden;"><a name="P3dPointerMouse"></a><h2>P3dPointerMouse</h2><p>This component sends pointer information to any <b>P3dHitScreen</b> component, allowing you to paint with the mouse.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>If you enable this, then a paint preview will be shown under the mouse as long as the <b>RequiredKey</b> is not pressed.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<KeyCode></b>
|
||
|
<br>
|
||
|
<span style="">Keys</span>
|
||
|
</h2>
|
||
|
<p>This component will paint while any of the specified mouse buttons or keyboard keys are held.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPointerPen"></a><h2>P3dPointerPen</h2><p>This component sends pointer information to any <b>P3dHitScreen</b> component, allowing you to paint with a pen.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Preview</span>
|
||
|
</h2>
|
||
|
<p>If you enable this, then a paint preview will be shown under the pen as long as the tip is not pressed.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Offset</span>
|
||
|
</h2>
|
||
|
<p>If you want the paint to appear above the pen, then you can set this number to something positive.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPointerTouch"></a><h2>P3dPointerTouch</h2><p>This component sends pointer information to any <b>P3dHitScreen</b> component, allowing you to paint with a touchscreen.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Offset</span>
|
||
|
</h2>
|
||
|
<p>If you want the paint to appear above the finger, then you can set this number to something positive.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dButtonClearAll"></a><h2>P3dButtonClearAll</h2><p>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.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">ClearStates</span>
|
||
|
</h2>
|
||
|
<p>When clearing a texture, should its undo states be cleared too?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dButtonRedoAll"></a><h2>P3dButtonRedoAll</h2><p>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.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">RedoAll</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If you want to manually trigger RedoAll, then call this function.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dButtonUndoAll"></a><h2>P3dButtonUndoAll</h2><p>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.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">UndoAll</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>If you want to manually trigger UndoAll, then call this function.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChangeCounterEvent"></a><h2>P3dChangeCounterEvent</h2><p>This component allows you to perform an event when the specified <b>P3dChangeCounter</b> instances are painted a specific amount.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dChangeCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p><b>None</b> = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector2</b>
|
||
|
<br>
|
||
|
<span style="">Range</span>
|
||
|
</h2>
|
||
|
<p>This paint ratio must be inside this range to be considered inside.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inside</span>
|
||
|
</h2>
|
||
|
<p>This tells you if the paint ratio is within the current <b>Range</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnInside</span>
|
||
|
</h2>
|
||
|
<p>This event will be called on the first frame <b>Inside</b> becomes true.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnOutside</span>
|
||
|
</h2>
|
||
|
<p>This event will be called on the first frame <b>Inside</b> becomes false.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Ratio</span>
|
||
|
</h2>
|
||
|
<p>This tells you the current paint ratio of the specified <b>Color</b>, where 0 is no paint, and 1 is fully painted.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChangeCounterFill"></a><h2>P3dChangeCounterFill</h2><p>This component fills the attached UI Image based on the total amount of pixels that have been painted in the specified <b>P3dChangeCounterFill</b> components.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dChangeCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p>Zero = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inverse</span>
|
||
|
</h2>
|
||
|
<p>Inverse the fill?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChangeCounterText"></a><h2>P3dChangeCounterText</h2><p>This component will output the total pixels for the specified team to a UI Text component.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dChangeCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p>Zero = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inverse</span>
|
||
|
</h2>
|
||
|
<p>Inverse the <b>Count</b> and <b>Percent</b> values?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">DecimalPlaces</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the amount of decimal places when using the percentage output.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">Format</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the format of the team text. You can use the following tokens:</p><p>{TOTAL} = Total amount of pixels that can be painted.</p><p>{COUNT} = Total amount of pixel that have been painted.</p><p>{PERCENT} = Percentage of pixels that have been painted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">StringEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnString</span>
|
||
|
</h2>
|
||
|
<p>The color count will be output via this event.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChannelCounterEvent"></a><h2>P3dChannelCounterEvent</h2><p>This component allows you to perform an event when the specified <b>P3dChannelCounter</b> instances are painted a specific amount.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dChannelCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p><b>None</b> = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ChannelType</b>
|
||
|
<br>
|
||
|
<span style="">Channel</span>
|
||
|
</h2>
|
||
|
<p>This allows you to choose which channel will be output to the UI Text.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector2</b>
|
||
|
<br>
|
||
|
<span style="">Range</span>
|
||
|
</h2>
|
||
|
<p>This paint ratio must be inside this range to be considered inside.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inside</span>
|
||
|
</h2>
|
||
|
<p>This tells you if the paint ratio is within the current <b>Range</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnInside</span>
|
||
|
</h2>
|
||
|
<p>This event will be called on the first frame <b>Inside</b> becomes true.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnOutside</span>
|
||
|
</h2>
|
||
|
<p>This event will be called on the first frame <b>Inside</b> becomes false.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Ratio</span>
|
||
|
</h2>
|
||
|
<p>This tells you the current paint ratio of the specified <b>Channel</b>, where 0 is no paint, and 1 is fully painted.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChannelCounterFill"></a><h2>P3dChannelCounterFill</h2><p>This component fills the attached UI Image based on the total amount of opaque pixels that have been painted in all active and enabled <b>P3dChannelCounter</b> components in the scene.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dChannelCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p>Zero = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ChannelType</b>
|
||
|
<br>
|
||
|
<span style="">Channel</span>
|
||
|
</h2>
|
||
|
<p>This allows you to choose which channel will be output to the UI Image.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inverse</span>
|
||
|
</h2>
|
||
|
<p>Inverse the fill?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dChannelCounterText"></a><h2>P3dChannelCounterText</h2><p>This component allows you to output the totals of all the specified pixel counters to a UI Text component.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dChannelCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p>Zero = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ChannelType</b>
|
||
|
<br>
|
||
|
<span style="">Channel</span>
|
||
|
</h2>
|
||
|
<p>This allows you to choose which channel will be output to the UI Text.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inverse</span>
|
||
|
</h2>
|
||
|
<p>Inverse the <b>Count</b> and <b>Percent</b> values?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">DecimalPlaces</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the amount of decimal places when using the percentage output.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">Format</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the format of the team text. You can use the following tokens:</p><p>{TOTAL} = Total amount of pixels that can be painted.</p><p>{COUNT} = Total amount of pixel that have been painted.</p><p>{PERCENT} = Percentage of pixels that have been painted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">StringEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnString</span>
|
||
|
</h2>
|
||
|
<p>The color count will be output via this event.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dColorCounterEvent"></a><h2>P3dColorCounterEvent</h2><p>This component allows you to perform an event when the specified <b>P3dColorCounter</b> instances are painted a specific amount.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dColorCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p><b>None</b> = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dColor</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set which color will be handled by this component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector2</b>
|
||
|
<br>
|
||
|
<span style="">Range</span>
|
||
|
</h2>
|
||
|
<p>This paint ratio must be inside this range to be considered inside.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inside</span>
|
||
|
</h2>
|
||
|
<p>This tells you if the paint ratio is within the current <b>Range</b>.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnInside</span>
|
||
|
</h2>
|
||
|
<p>This event will be called on the first frame <b>Inside</b> becomes true.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnOutside</span>
|
||
|
</h2>
|
||
|
<p>This event will be called on the first frame <b>Inside</b> becomes false.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Ratio</span>
|
||
|
</h2>
|
||
|
<p>This tells you the current paint ratio of the specified <b>Color</b>, where 0 is no paint, and 1 is fully painted.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dColorCounterFill"></a><h2>P3dColorCounterFill</h2><p>This component fills the attached UI Image based on the total amount of pixels that have been painted in the specified <b>P3dColorCounter</b> components.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dColorCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p>Zero = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dColor</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set which color will be handled by this component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inverse</span>
|
||
|
</h2>
|
||
|
<p>Inverse the fill?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dColorCounterText"></a><h2>P3dColorCounterText</h2><p>This component will output the total pixels for the specified color to the <b>OnString</b> event.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<P3dColorCounter></b>
|
||
|
<br>
|
||
|
<span style="">Counters</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the counters that will be used.</p><p>Zero = All active and enabled counters in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">P3dColor</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set which color will be handled by this component.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Inverse</span>
|
||
|
</h2>
|
||
|
<p>Inverse the <b>Count</b> and <b>Percent</b> values?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">DecimalPlaces</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the amount of decimal places when using the percentage output.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">Format</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the format of the team text. You can use the following tokens:</p><p>{TOTAL} = Total amount of pixels that can be painted.</p><p>{COUNT} = Total amount of pixel that have been painted.</p><p>{PERCENT} = Percentage of pixels that have been painted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">StringEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnString</span>
|
||
|
</h2>
|
||
|
<p>The color count will be output via this event.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintDebug"></a><h2>P3dPaintDebug</h2><p>This component allows you to debug hit points into the <b>Scene</b> tab. Hit points will automatically be sent by any <b>P3dHit___</b> component on this GameObject, or its ancestors.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>The color of the debug.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Duration</span>
|
||
|
</h2>
|
||
|
<p>The duration of the debug.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Size</span>
|
||
|
</h2>
|
||
|
<p>The size of the debug.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dSpawner"></a><h2>P3dSpawner</h2><p>This allows you to spawn a prefab at a hit point. Hit points will automatically be sent by any <b>P3dHit___</b> component on this GameObject, or its ancestors.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">List<GameObject></b>
|
||
|
<br>
|
||
|
<span style="">Prefabs</span>
|
||
|
</h2>
|
||
|
<p>A random prefab from this list will be spawned.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Radius</span>
|
||
|
</h2>
|
||
|
<p>The spawned prefab will be randomly offset by a random point within this radius in world space.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">Velocity</span>
|
||
|
</h2>
|
||
|
<p>If the prefab contains a <b>Rigidbody</b>, it will be given this velocity in local space.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">OffsetNormal</span>
|
||
|
</h2>
|
||
|
<p>The spawned prefab will be offset from the hit point based on the hit normal by this value in world space.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">OffsetWorld</span>
|
||
|
</h2>
|
||
|
<p>The spawned prefab will be offset from the hit point based on this value in world space.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Spawn</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>Call this if you want to manually spawn the specified prefab.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dActionOnEnable"></a><h2>P3dActionOnEnable</h2><p>This component invokes the <b>Action</b> event when this component is enabled.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">UnityEvent</b>
|
||
|
<br>
|
||
|
<span style="">Action</span>
|
||
|
</h2>
|
||
|
<p>The event that will be invoked.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dCommandSerialization"></a><h2>P3dCommandSerialization</h2><p>This component shows you how to listen for and store paint commands added to any <b>P3dPaintableTexture</b> component in the scene.</p><p>This component can then reset each paintable texture, and randomly apply one of the recorded paint commands.</p><div class="tip"><strong>NOTE</strong>  For a paint command to be able to be de/serialized, all P3dModel, P3dPaintable, P3dPaintableTexture, and Texture instance associated with the paint command must be registered with a unique hash code that will be the same across all application runs and clients.</div><div class="tip"><strong>NOTE</strong>  The hash codes for the P3d___ components can be set using the <b>Advanced/Hash</b> setting, but the <b>Texture</b> instances must be done separately using either the <b>P3dTextureHash</b> component, or manual calls to <b>P3dSerialization.TryRegister(texture)</b> before you attempt to de/serialize a paint command.</div><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">Listening</span>
|
||
|
</h2>
|
||
|
<p>Should this component listen for added commands?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Clear</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will pool and clear all commands.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">RebuildRandomCommand</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This method will clear all paintable textures, and apply one random paint command that was recorded.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dDestroyAfterTime"></a><h2>P3dDestroyAfterTime</h2><p>This component automatically destroys this GameObject after some time.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Seconds</span>
|
||
|
</h2>
|
||
|
<p>If this component has been active for this many seconds, the current GameObject will be destroyed.</p><p>-1 = DestroyNow must be manually called.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dDestroyer"></a><h2>P3dDestroyer</h2><p>This component automatically destroys the specified GameObject when sent a hit point. Hit points will automatically be sent by any <b>P3dHit___</b> component on this GameObject, or its ancestors.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">GameObject</b>
|
||
|
<br>
|
||
|
<span style="">Target</span>
|
||
|
</h2>
|
||
|
<p>This GameObject will be destroyed.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dDragPitchYaw"></a><h2>P3dDragPitchYaw</h2><p>This component adds basic Pitch/Yaw controls to the current GameObject (e.g. camera) using mouse or touch controls.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Transform</b>
|
||
|
<br>
|
||
|
<span style="">Tools</span>
|
||
|
</h2>
|
||
|
<p>Rotation will be active if all of these tools are deactivated.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">Key</span>
|
||
|
</h2>
|
||
|
<p>The key that must be held for this component to activate on desktop platforms.</p><p>None = Any mouse button.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">GuiLayers</span>
|
||
|
</h2>
|
||
|
<p>Fingers that began touching the screen on top of these UI layers will be ignored.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Pitch</span>
|
||
|
</h2>
|
||
|
<p>The target pitch angle in degrees.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PitchSensitivity</span>
|
||
|
</h2>
|
||
|
<p>The speed the pitch changed relative to the mouse/finger drag distance.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PitchMin</span>
|
||
|
</h2>
|
||
|
<p>The minimum value of the pitch value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">PitchMax</span>
|
||
|
</h2>
|
||
|
<p>The maximum value of the pitch value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Yaw</span>
|
||
|
</h2>
|
||
|
<p>The target yaw angle in degrees.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">YawSensitivity</span>
|
||
|
</h2>
|
||
|
<p>The speed the yaw changed relative to the mouse/finger drag distance.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Dampening</span>
|
||
|
</h2>
|
||
|
<p>How quickly the rotation transitions from the current to the target value (-1 = instant).</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dInputAxis"></a><h2>P3dInputAxis</h2><p>This component allows you to convert input axis values to a boolean event. This can be used to map VR buttons to other components.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">string</b>
|
||
|
<br>
|
||
|
<span style="">AxisName</span>
|
||
|
</h2>
|
||
|
<p>The name of the input axis in the Project Settings.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">int</b>
|
||
|
<br>
|
||
|
<span style="">AxisIndex</span>
|
||
|
</h2>
|
||
|
<p>The index of the input axis in the Project Settings.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dPaintFromCode"></a><h2>P3dPaintFromCode</h2><p>This component shows you how to paint from code.</p><br><br></div><div style="overflow:hidden;"><a name="P3dPaintMultiplayer"></a><h2>P3dPaintMultiplayer</h2><p>This component listens for <b>point</b> and <b>line</b> painting events. It then simulates transmitting them over a network with a delay, and then painting the received data.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Delay</span>
|
||
|
</h2>
|
||
|
<p>This allows you to specify the simulated delay between painting across the network in seconds.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dProceduralSetup"></a><h2>P3dProceduralSetup</h2><p>This component can be added to an empty GameObject, and it will set it up with a procedurally generated quad that is ready for painting.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Material</b>
|
||
|
<br>
|
||
|
<span style="">Material</span>
|
||
|
</h2>
|
||
|
<p>The <b>Material</b> applied to the renderer.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Size</span>
|
||
|
</h2>
|
||
|
<p>The size of the generated quad in local space.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dReadColorEvent"></a><h2>P3dReadColorEvent</h2><p>This component allows you to perform an event when the attached <b>P3dReadColor</b> component reads a specific color.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Color</b>
|
||
|
<br>
|
||
|
<span style="">Color</span>
|
||
|
</h2>
|
||
|
<p>This color we want to detect.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Threshold</span>
|
||
|
</h2>
|
||
|
<p>The RGBA values must be within this range of a color for it to be counted.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ColorEvent</b>
|
||
|
<br>
|
||
|
<span style="">OnColor</span>
|
||
|
</h2>
|
||
|
<p>When the expected color is read, this event will be invoked.</p><p>Color = The expected color.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dRotate"></a><h2>P3dRotate</h2><p>This component allows you to rotate the current <b>Transform</b>.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Space</b>
|
||
|
<br>
|
||
|
<span style="">Space</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the coordinate space the movement will use.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">PerSecond</span>
|
||
|
</h2>
|
||
|
<p>The position will be incremented by this each second.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dSpiral"></a><h2>P3dSpiral</h2><p>This component moves the current <b>Transform</b> in a spiral pattern.</p><br><br></div><div style="overflow:hidden;"><a name="P3dTapThrow"></a><h2>P3dTapThrow</h2><p>This component will spawn and throw Rigidbody prefabs from the camera when you tap the mouse or a finger.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">Key</span>
|
||
|
</h2>
|
||
|
<p>The key that must be held for this component to activate on desktop platforms.</p><p>None = Any mouse button.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">GuiLayers</span>
|
||
|
</h2>
|
||
|
<p>Fingers that began touching the screen on top of these UI layers will be ignored.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">GameObject</b>
|
||
|
<br>
|
||
|
<span style="">Prefab</span>
|
||
|
</h2>
|
||
|
<p>The prefab that will be thrown.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Speed</span>
|
||
|
</h2>
|
||
|
<p>The speed that the object will be thrown at.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">StoreStates</span>
|
||
|
</h2>
|
||
|
<p>Should painting triggered from this component be eligible for being undone?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dToggleParticles"></a><h2>P3dToggleParticles</h2><p>This component enables or disables the specified ParticleSystem based on mouse or finger presses.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">LayerMask</b>
|
||
|
<br>
|
||
|
<span style="">GuiLayers</span>
|
||
|
</h2>
|
||
|
<p>Fingers that began touching the screen on top of these UI layers will be ignored.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">Key</span>
|
||
|
</h2>
|
||
|
<p>The key that must be held for this component to activate.</p><p>None = Any mouse button or finger.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">ParticleSystem</b>
|
||
|
<br>
|
||
|
<span style="">Target</span>
|
||
|
</h2>
|
||
|
<p>The particle system that will be enabled/disabled based on mouse/touch.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">StoreStates</span>
|
||
|
</h2>
|
||
|
<p>Should painting triggered from this component be eligible for being undone?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dToggleScript"></a><h2>P3dToggleScript</h2><p>This component allows you to enable/disable the target component while the specified key is held down.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">Key</span>
|
||
|
</h2>
|
||
|
<p>The key that must be held for this component to activate.</p><p>None = Any mouse button or finger.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">MonoBehaviour</b>
|
||
|
<br>
|
||
|
<span style="">Target</span>
|
||
|
</h2>
|
||
|
<p>The component that will be enabled or disabled.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">StoreStates</span>
|
||
|
</h2>
|
||
|
<p>Should painting triggered from this component be eligible for being undone?</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dTranslate"></a><h2>P3dTranslate</h2><p>This component allows you to move the current <b>Transform</b> using editor events (e.g. UI buttons).</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Space</b>
|
||
|
<br>
|
||
|
<span style="">Space</span>
|
||
|
</h2>
|
||
|
<p>This allows you to set the coordinate space the movement will use.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Multiplier</span>
|
||
|
</h2>
|
||
|
<p>The movement values will be multiplied by this before use.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">Damping</span>
|
||
|
</h2>
|
||
|
<p>If you want this component to change smoothly over time, then this allows you to control how quick the changes reach their target value.</p><p>-1 = Instantly change.</p><p>1 = Slowly change.</p><p>10 = Quickly change.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">PerSecond</span>
|
||
|
</h2>
|
||
|
<p>The position will be incremented by this each second.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">TranslateX</span>
|
||
|
<br>
|
||
|
<b>float magnitude</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to translate along the X axis, with the specified value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">TranslateY</span>
|
||
|
<br>
|
||
|
<b>float magnitude</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to translate along the Y axis, with the specified value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">TranslateZ</span>
|
||
|
<br>
|
||
|
<b>float magnitude</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to translate along the Z axis, with the specified value.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Translate</span>
|
||
|
<br>
|
||
|
<b>Vector3 vector</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to translate along the specified vector.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">TranslateWorld</span>
|
||
|
<br>
|
||
|
<b>Vector3 vector</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to translate along the specified vector in world space.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dVrManager"></a><h2>P3dVrManager</h2><p>This component attached the current GameObject to a tracked hand.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">// KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">RecenterKey</span>
|
||
|
</h2>
|
||
|
<p>This key allows you to reset the VR orientation.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">GrabDistance</span>
|
||
|
</h2>
|
||
|
<p>The default distance in world space a hand must be to grab a tool.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedLeftTrigger</span>
|
||
|
</h2>
|
||
|
<p>This key allows you to simulate a left hand VR trigger.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedLeftGrip</span>
|
||
|
</h2>
|
||
|
<p>This key allows you to simulate a left hand VR grip.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedRightTrigger</span>
|
||
|
</h2>
|
||
|
<p>This key allows you to simulate a right hand VR trigger.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">KeyCode</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedRightGrip</span>
|
||
|
</h2>
|
||
|
<p>This key allows you to simulate a right hand VR grip.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedTilt</span>
|
||
|
</h2>
|
||
|
<p>When simulating a VR tool, it will be offset by this Euler rotation.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedOffset</span>
|
||
|
</h2>
|
||
|
<p>When simulating a VR tool, it will be offset by this local position.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedDistanceMax</span>
|
||
|
</h2>
|
||
|
<p>When simulating a VR tool, it will be moved away from the hit surface by this.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedEyeOffset</span>
|
||
|
</h2>
|
||
|
<p>The simulated left VR eye will be offset this much.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedNormalInfluence</span>
|
||
|
</h2>
|
||
|
<p>When simulating a VR tool, this will control how much the hit surface normal influences the tool rotation.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static LinkedList<P3dVrManager></b>
|
||
|
<br>
|
||
|
<span style="">Instances</span>
|
||
|
</h2>
|
||
|
<p>This stores all active and enabled instances in the open scenes.</p>
|
||
|
</div><br><br><br></div><div style="overflow:hidden;"><a name="P3dVrTool"></a><h2>P3dVrTool</h2><p>This component attached the current GameObject to a tracked hand.</p><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">XRNode</b>
|
||
|
<br>
|
||
|
<span style="">Node</span>
|
||
|
</h2>
|
||
|
<p>The XR node this GameObject will follow.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">bool</b>
|
||
|
<br>
|
||
|
<span style="">StoreStates</span>
|
||
|
</h2>
|
||
|
<p>Should painting triggered from this component be eligible for being undone?</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">LocalOffset</span>
|
||
|
</h2>
|
||
|
<p>This tool will be offset by this vector in local space.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedOffset</span>
|
||
|
</h2>
|
||
|
<p>When simulating a VR tool, it will be offset by this local position.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">Vector3</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedKeyOffset</span>
|
||
|
</h2>
|
||
|
<p>The <b>SimulatedOffset</b> value will be offset by this when the simulated key is held.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">float</b>
|
||
|
<br>
|
||
|
<span style="">SimulatedDampening</span>
|
||
|
</h2>
|
||
|
<p>This allows you to control the speed of the simulated transform changes.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">Drop</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This will drop the current tool.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">void</b>
|
||
|
<br>
|
||
|
<span style="">DropAndGrabNextTool</span>
|
||
|
<br>
|
||
|
<b></b>
|
||
|
</h2>
|
||
|
<p>This will drop the current tool and grab the next in the scene.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static List<P3dVrTool></b>
|
||
|
<br>
|
||
|
<span style="">GetTools</span>
|
||
|
<br>
|
||
|
<b>XRNode node</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to find the tool currently on the specified node.</p>
|
||
|
</div><br><div style="padding-left:75px;"><br>
|
||
|
<h2>
|
||
|
<b style="">static void</b>
|
||
|
<br>
|
||
|
<span style="">DropAllTools</span>
|
||
|
<br>
|
||
|
<b>XRNode node</b>
|
||
|
</h2>
|
||
|
<p>This method allows you to drop all tools on the specified node.</p>
|
||
|
</div><br><br><br></div>
|
||
|
</div>
|
||
|
<div style="position: absolute; width: 310px; left: 0px; right: 0px; top: 20px; bottom: 20px; overflow-y: scroll; padding: 20px;">
|
||
|
<h2 style="padding-bottom: 5px;">Index</h2>
|
||
|
<p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#ThankYou">Thank you for using Paint in 3D ❤️</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Upgrade">How do I upgrade?</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#SRP">Is URP/HDRP supported?</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Shaders">Are custom shaders/materials supported?</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#VR">Is VR supported?</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Save">Can I save my in-game paint to my project?</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#InputSystem">Is the new InputSystem supported?</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#InGame">Getting Started (In-Game)</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#InEditor">Getting Started (In-Editor)</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#UV">UV Data Requirements</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Seams">Fixing UV Seams</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#UV_Examples">Examples Of UV Maps</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Undo">Undo & Redo</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Blend">Blend Modes</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Blend">Skinned Mesh Painting</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Lines">Drawing Connected Lines</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#MultiTexture">Painting Multiple Textures</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Optimization">Advanced Optimization</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Issues">Known Issues</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#CreatePresets">Can I Create New Paint Presets?</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#CreateTools">Can I Create New Paint Tools? (In-Editor)</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#CreateMaterials">Can I Create New Paint Materials? (In-Editor)</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#DeSerialization">Can Each Individual Paint Be De/Serialized? (e.g. networking)</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#Examples">What Examples Are Included?</a></p>
|
||
|
<br><br>
|
||
|
<h2 style="padding-bottom: 5px;">Assets</h2>
|
||
|
<p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanTouch">Lean Touch</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanTouchPlus">Lean Touch+</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanLocalization">Lean Localization</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanPool">Lean Pool</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanTransition">Lean Transition</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanGUI">Lean GUI</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanGUIShapes">Lean GUI Shapes</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanTexture">Lean Texture</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetLeanTexturePlus">Lean Texture+</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetSpaceships">CW Spaceships</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetOrbit">CW Orbit</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetNebula">CW Nebula</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetGasGiant">CW Gas Giant</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetGalaxy">CW Galaxy</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetSilhouette">CW Silhouette</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetCosmos">CW Cosmos</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetPaintIn3D">Paint in 3D</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetFlow">FLOW</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetDestructible2D">Destructible 2D</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetSpaceGraphicsToolkit">Space Graphics Toolkit</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetPlanetPack">Space Graphics Planets</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#GetVolumetricAudio">Volumetric Audio</a></p>
|
||
|
<br><br>
|
||
|
<h2 style="padding-bottom: 5px;">Versions</h2>
|
||
|
<p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#3.1.1">3.1.1</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#3.1.0">3.1.0</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#3.0.3">3.0.3</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#3.0.2">3.0.2</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#3.0.1">3.0.1</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#3.0.0">3.0.0</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#2.0.4">2.0.4</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#2.0.3">2.0.3</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#2.0.2">2.0.2</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#2.0.1">2.0.1</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#2.0.0">2.0.0</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.14">1.11.14</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.13">1.11.13</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.12">1.11.12</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.11">1.11.11</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.10">1.11.10</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.9">1.11.9</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.8">1.11.8</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.7">1.11.7</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.6">1.11.6</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.5">1.11.5</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.4">1.11.4</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.3">1.11.3</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.2">1.11.2</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.11.1">1.11.1</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.10.5">1.10.5</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.10.4">1.10.4</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.10.3">1.10.3</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.10.2">1.10.2</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.10.1">1.10.1</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.14">1.9.14</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.13">1.9.13</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.12">1.9.12</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.11">1.9.11</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.10">1.9.10</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.9">1.9.9</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.8">1.9.8</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.7">1.9.7</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.6">1.9.6</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.5">1.9.5</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.4">1.9.4</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.3">1.9.3</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#1.9.2">1.9.2</
|
||
|
<br><br>
|
||
|
<h2 style="padding-bottom: 5px;">Components</h2>
|
||
|
<p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#IClone">IClone</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#IHit">IHit</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#IHitCoord">IHitCoord</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#IHitLine">IHitLine</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#IHitPoint">IHitPoint</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#IHitQuad">IHitQuad</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#IHitTriangle">IHitTriangle</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dBlendMode">P3dBlendMode</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dChangeCounter">P3dChangeCounter</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dChannelCounter">P3dChannelCounter</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dClone">P3dClone</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dCloneMirror">P3dCloneMirror</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dColor">P3dColor</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dColorCounter">P3dColorCounter</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dCommand">P3dCommand</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dCommon">P3dCommon</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dCoordCopier">P3dCoordCopier</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#CwEditorWindow">CwEditorWindow</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dGraduallyFade">P3dGraduallyFade</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dGroup">P3dGroup</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dGroupData">P3dGroupData</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dHashedMaterial">P3dHashedMaterial</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dHashedModel">P3dHashedModel</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dHashedTexture">P3dHashedTexture</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dHit">P3dHit</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dLineConnector">P3dLineConnector</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dMask">P3dMask</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dMaterialCloner">P3dMaterialCloner</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dModel">P3dModel</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dModifier">P3dModifier</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dModifierList">P3dModifierList</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dPaintable">P3dPaintable</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dPaintableManager">P3dPaintableManager</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dPaintableState">P3dPaintableState</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dPaintableTexture">P3dPaintableTexture</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dPaintableTextureMonitor">P3dPaintableTextureMonitor</a></p><p style="margin: 2px; padding-left: 10px; text-indent: -10px;"><a href="#P3dPaintableTextureMonitorMask">P3dPaintableTextureMonitorMask</a></p><p style="margin: 2px; paddi
|
||
|
<br><br>
|
||
|
</div>
|
||
|
<div style="background-color: #0075D0; position: absolute; left: 0px; right: 0px; bottom: 0px; height: 20px;">
|
||
|
</div>
|
||
|
</body>
|
||
|
</html>
|