├── .gitignore ├── LICENSE ├── README.md ├── icon ├── out_mirrorPlane.png └── out_mirrorPlane0.png ├── plugins ├── 2016 │ ├── linux │ │ └── mirrorPlane.so │ └── windows │ │ └── mirrorPlane.mll ├── 2017 │ ├── linux │ │ └── mirrorPlane.so │ └── windows │ │ └── mirrorPlane.mll └── 2018 │ ├── linux │ └── mirrorPlane.so │ └── windows │ └── mirrorPlane.mll └── source ├── Makefile ├── Makefile.inc ├── mirrorPlane.cpp └── mirrorPlane.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files 2 | *.slo 3 | *.lo 4 | *.o 5 | *.obj 6 | 7 | # Precompiled Headers 8 | *.gch 9 | *.pch 10 | 11 | # Compiled Dynamic libraries 12 | *.dylib 13 | *.dll 14 | 15 | # Fortran module files 16 | *.mod 17 | *.smod 18 | 19 | # Compiled Static libraries 20 | *.lai 21 | *.la 22 | *.a 23 | *.lib 24 | 25 | # Executables 26 | *.exe 27 | *.out 28 | *.app 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # maya-plugin-mirror-plane 2 | Maya custom locator node with a transparent shape. support viewport2.0 diaplay mode. 3 | 4 | 5 | #### MAYA NODE ID 6 | * Node ID : 0x71000 7 | 8 | 9 | #### INSTALLATION 10 | 1. Download the latest release and unzip the folder where you want to live. 11 | 2. Copy icon file "out_mirrorPlane.png" into `%USERPROFILE%\Documents\maya\mayaVersion\prefs\icons` 12 | 3. Copy Plugin file "mirrorPlane.so(.mll)" into you maya's plugins folder. 13 | 4. Load plugin in maya, run these commands in Python to create mirrorPlane node. 14 | 15 | 16 | ```python 17 | import maya.cmds as cmds 18 | cmds.createNode("mirrorPlane") 19 | ``` 20 | -------------------------------------------------------------------------------- /icon/out_mirrorPlane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/icon/out_mirrorPlane.png -------------------------------------------------------------------------------- /icon/out_mirrorPlane0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/icon/out_mirrorPlane0.png -------------------------------------------------------------------------------- /plugins/2016/linux/mirrorPlane.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/plugins/2016/linux/mirrorPlane.so -------------------------------------------------------------------------------- /plugins/2016/windows/mirrorPlane.mll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/plugins/2016/windows/mirrorPlane.mll -------------------------------------------------------------------------------- /plugins/2017/linux/mirrorPlane.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/plugins/2017/linux/mirrorPlane.so -------------------------------------------------------------------------------- /plugins/2017/windows/mirrorPlane.mll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/plugins/2017/windows/mirrorPlane.mll -------------------------------------------------------------------------------- /plugins/2018/linux/mirrorPlane.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/plugins/2018/linux/mirrorPlane.so -------------------------------------------------------------------------------- /plugins/2018/windows/mirrorPlane.mll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/astips/maya-plugin-mirror-plane/9246fec3cd08e7caa72990ba32f0ae8317e5d73e/plugins/2018/windows/mirrorPlane.mll -------------------------------------------------------------------------------- /source/Makefile: -------------------------------------------------------------------------------- 1 | #- 2 | # ========================================================================== 3 | # Copyright (c) 2011 Autodesk, Inc. 4 | # All rights reserved. 5 | # 6 | # These coded instructions, statements, and computer programs contain 7 | # unpublished proprietary information written by Autodesk, Inc., and are 8 | # protected by Federal copyright law. They may not be disclosed to third 9 | # parties or copied or duplicated in any form, in whole or in part, without 10 | # the prior written consent of Autodesk, Inc. 11 | # ========================================================================== 12 | #+ 13 | 14 | ifndef INCL_BUILDRULES 15 | 16 | # 17 | # Include platform specific build settings 18 | # 19 | TOP := .. 20 | include $(TOP)/buildrules 21 | 22 | 23 | # 24 | # Always build the local plug-in when make is invoked from the 25 | # directory. 26 | # 27 | all : plugins 28 | 29 | endif 30 | 31 | # 32 | # Variable definitions 33 | # 34 | 35 | PLUGIN_NAME := mirrorPlane 36 | 37 | SRCDIR := $(TOP)/mirrorPlane 38 | DSTDIR := $(TOP)/mirrorPlane/build 39 | 40 | $(PLUGIN_NAME)_SOURCES := $(TOP)/mirrorPlane/mirrorPlane.cpp 41 | $(PLUGIN_NAME)_OBJECTS := $(TOP)/mirrorPlane/mirrorPlane.o 42 | $(PLUGIN_NAME)_PLUGIN := $(DSTDIR)/$(PLUGIN_NAME).$(EXT) 43 | $(PLUGIN_NAME)_MAKEFILE := $(DSTDIR)/Makefile 44 | 45 | # 46 | # Include the optional per-plugin Makefile.inc 47 | # 48 | # The file can contain macro definitions such as: 49 | # {pluginName}_EXTRA_CFLAGS 50 | # {pluginName}_EXTRA_C++FLAGS 51 | # {pluginName}_EXTRA_INCLUDES 52 | # {pluginName}_EXTRA_LIBS 53 | -include $(SRCDIR)/Makefile.inc 54 | 55 | # 56 | # Set target specific flags. 57 | # 58 | 59 | $($(PLUGIN_NAME)_OBJECTS): CFLAGS := $(CFLAGS) $($(PLUGIN_NAME)_EXTRA_CFLAGS) 60 | $($(PLUGIN_NAME)_OBJECTS): C++FLAGS := $(C++FLAGS) $($(PLUGIN_NAME)_EXTRA_C++FLAGS) -DNDEBUG -msse3 61 | $($(PLUGIN_NAME)_OBJECTS): INCLUDES := $(INCLUDES) $($(PLUGIN_NAME)_EXTRA_INCLUDES) -I../nlib -I. -I$(MAYA_LOCATION)/include -I/usr/include/X11/ 62 | 63 | depend_$(PLUGIN_NAME): INCLUDES := $(INCLUDES) $($(PLUGIN_NAME)_EXTRA_INCLUDES) 64 | 65 | $($(PLUGIN_NAME)_PLUGIN): LFLAGS := $(LFLAGS) $($(PLUGIN_NAME)_EXTRA_LFLAGS) 66 | $($(PLUGIN_NAME)_PLUGIN): LIBS := $(LIBS) -lOpenMaya -lOpenMayaAnim -lOpenMayaUI -lOpenMayaRender -lFoundation -lclew $($(PLUGIN_NAME)_EXTRA_LIBS) 67 | 68 | # -lOpenGL 69 | # 70 | # Rules definitions 71 | # 72 | 73 | .PHONY: depend_$(PLUGIN_NAME) clean_$(PLUGIN_NAME) Clean_$(PLUGIN_NAME) 74 | 75 | 76 | $($(PLUGIN_NAME)_PLUGIN): $($(PLUGIN_NAME)_OBJECTS) 77 | -rm -f $@ 78 | $(LD) -o $@ $(LFLAGS) $^ $(LIBS) 79 | 80 | depend_$(PLUGIN_NAME) : 81 | makedepend $(INCLUDES) $(MDFLAGS) -f$(DSTDIR)/Makefile $($(PLUGIN_NAME)_SOURCES) 82 | 83 | clean_$(PLUGIN_NAME): 84 | -rm -f $($(PLUGIN_NAME)_OBJECTS) 85 | 86 | Clean_$(PLUGIN_NAME): 87 | -rm -f $($(PLUGIN_NAME)_MAKEFILE).bak $($(PLUGIN_NAME)_OBJECTS) $($(PLUGIN_NAME)_PLUGIN) 88 | 89 | 90 | plugins: $($(PLUGIN_NAME)_PLUGIN) 91 | depend: depend_$(PLUGIN_NAME) 92 | clean: clean_$(PLUGIN_NAME) 93 | Clean: Clean_$(PLUGIN_NAME) 94 | -------------------------------------------------------------------------------- /source/Makefile.inc: -------------------------------------------------------------------------------- 1 | MYPARSE_INC = -I/usr/include -I/usr/include/ -I/usr/include/GL 2 | 3 | hairTouchUp_EXTRA_INCLUDES = $(MYPARSE_INC) 4 | -------------------------------------------------------------------------------- /source/mirrorPlane.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Author : astips 4 | 5 | Github : https://github.com/astips 6 | 7 | */ 8 | 9 | 10 | #include "mirrorPlane.h" 11 | 12 | 13 | static float plane[][3] = { { 0.00f, 1.00f, 1.00f }, 14 | { 0.00f, -1.00f, 1.00f }, 15 | { 0.00f, -1.00f, -1.00f }, 16 | { 0.00f, 1.00f, -1.00f } }; 17 | 18 | 19 | MTypeId MirrorPlane::id( 0x71000 ); 20 | MString MirrorPlane::drawDbClassification( "drawdb/geometry/mirrorPlane_GeometryOverride" ); 21 | MString MirrorPlane::drawRegistrantId( "MirrorPlaneNode_GeometryOverridePlugin" ); 22 | MObject MirrorPlane::hyaline; 23 | MObject MirrorPlane::size; 24 | MObject MirrorPlane::top; 25 | MObject MirrorPlane::bottom; 26 | MObject MirrorPlane::front; 27 | MObject MirrorPlane::back; 28 | MObject MirrorPlane::asType; 29 | 30 | 31 | void* MirrorPlane::creator() 32 | { 33 | return new MirrorPlane(); 34 | } 35 | 36 | 37 | MStatus MirrorPlane::compute( const MPlug& , MDataBlock& ) 38 | { 39 | return MS::kUnknownParameter; 40 | } 41 | 42 | 43 | bool MirrorPlane::excludeAsLocator() const 44 | { 45 | MObject thisNode = thisMObject(); 46 | MPlug asTypePlug( thisNode, MirrorPlane::asType ); 47 | bool hideIt; 48 | asTypePlug.getValue( hideIt ); 49 | return !hideIt; 50 | } 51 | 52 | 53 | float MirrorPlane::unitValue( const MPlug& plug ) 54 | { 55 | MDistance dist; 56 | plug.getValue( dist ); 57 | return (float)dist.asCentimeters(); 58 | } 59 | 60 | 61 | void MirrorPlane::draw( M3dView& view, 62 | const MDagPath& path, 63 | M3dView::DisplayStyle style, 64 | M3dView::DisplayStatus status ) 65 | { 66 | 67 | MObject thisNode = thisMObject(); 68 | 69 | MPlug localPositionXPlug( thisNode, MirrorPlane::localPositionX ); 70 | MPlug localPositionYPlug( thisNode, MirrorPlane::localPositionY ); 71 | MPlug localPositionZPlug( thisNode, MirrorPlane::localPositionZ ); 72 | float lpx = localPositionXPlug.asFloat(); 73 | float lpy = localPositionYPlug.asFloat(); 74 | float lpz = localPositionZPlug.asFloat(); 75 | 76 | MPlug localScaleYPlug( thisNode, MirrorPlane::localScaleY ); 77 | MPlug localScaleZPlug( thisNode, MirrorPlane::localScaleZ ); 78 | float lsy = localScaleYPlug.asFloat(); 79 | float lsz = localScaleZPlug.asFloat(); 80 | 81 | MPlug hyalinePlug( thisNode, MirrorPlane::hyaline ); 82 | float newHyaline = hyalinePlug.asFloat(); 83 | 84 | MPlug sizePlug( thisNode, MirrorPlane::size ); 85 | float newSize = unitValue( sizePlug ); 86 | 87 | MPlug topPlug( thisNode, MirrorPlane::top ); 88 | float newTop = unitValue( topPlug ); 89 | 90 | MPlug bottomPlug( thisNode, MirrorPlane::bottom ); 91 | float newBottom = unitValue( bottomPlug ); 92 | 93 | MPlug frontPlug( thisNode, MirrorPlane::front ); 94 | float newFront = unitValue( frontPlug ); 95 | 96 | MPlug backPlug( thisNode, MirrorPlane::back ); 97 | float newBack = unitValue( backPlug ); 98 | 99 | view.beginGL(); 100 | 101 | glPushAttrib( GL_CURRENT_BIT ); 102 | glEnable( GL_BLEND ); 103 | glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); 104 | 105 | if ( status == M3dView::kDormant ) 106 | { 107 | glColor4f( 0.5f, 0.2f, 0.1f, 1.0f * newHyaline ); 108 | } 109 | 110 | if ( status == M3dView::kActive ) 111 | { 112 | glColor4f( 0.5f, 1.0f, 0.5f, 0.8f * newHyaline ); 113 | } 114 | 115 | if ( status == M3dView::kLead ) 116 | { 117 | glColor4f( 0.75f, 1.0f, 0.75f, 1.0f * newHyaline ); 118 | } 119 | 120 | if ( status == M3dView::kNoStatus ) 121 | { 122 | glColor4f( 0.0f, 0.0f, 0.0f, 1.0f * newHyaline ); 123 | } 124 | 125 | glBegin( GL_POLYGON ); 126 | glVertex3f( plane[0][0] + lpx, plane[0][1] * newSize * newTop * lsy + lpy, plane[0][2] * newSize * newFront * lsz + lpz ); 127 | glVertex3f( plane[1][0] + lpx, plane[1][1] * newSize * newBottom * lsy + lpy, plane[1][2] * newSize * newFront * lsz + lpz ); 128 | glVertex3f( plane[2][0] + lpx, plane[2][1] * newSize * newBottom * lsy + lpy, plane[2][2] * newSize * newBack * lsz + lpz ); 129 | glVertex3f( plane[3][0] + lpx, plane[3][1] * newSize * newTop * lsy + lpy, plane[3][2] * newSize * newBack * lsz + lpz ); 130 | glEnd(); 131 | 132 | glDisable( GL_BLEND ); 133 | glPopAttrib(); 134 | 135 | view.endGL(); 136 | } 137 | 138 | 139 | MBoundingBox MirrorPlane::boundingBox() const 140 | { 141 | MObject thisNode = thisMObject(); 142 | MPlug plug( thisNode, size ); 143 | MDistance sizeVal; 144 | plug.getValue( sizeVal ); 145 | double multiplier = sizeVal.asCentimeters(); 146 | MPoint corner1( 0.0, 1.0, 1.0 ); 147 | MPoint corner2( 0.0, -1.0, -1.0 ); 148 | corner1 = corner1 * multiplier; 149 | corner2 = corner2 * multiplier; 150 | return MBoundingBox( corner1, corner2 ); 151 | } 152 | 153 | 154 | MStatus MirrorPlane::initialize() 155 | { 156 | MStatus status; 157 | 158 | MFnNumericAttribute numericFn; 159 | MFnUnitAttribute unitFn; 160 | MFnEnumAttribute enumFn; 161 | 162 | MirrorPlane::hyaline = numericFn.create( "hyaline", "hy", MFnNumericData::kFloat, 0.5 ); 163 | numericFn.setHidden( false ); 164 | numericFn.setKeyable( false ); 165 | numericFn.setChannelBox( true ); 166 | numericFn.setMin( 0.0 ); 167 | numericFn.setMax( 1.0 ); 168 | addAttribute( MirrorPlane::hyaline ); 169 | 170 | MirrorPlane::size = unitFn.create( "size", "sz", MFnUnitAttribute::kDistance, 1.0 ); 171 | unitFn.setHidden( false ); 172 | unitFn.setKeyable( false ); 173 | unitFn.setChannelBox( true ); 174 | addAttribute( MirrorPlane::size ); 175 | 176 | MirrorPlane::top = unitFn.create( "top", "tp", MFnUnitAttribute::kDistance, 1.0 ); 177 | unitFn.setHidden( false ); 178 | unitFn.setKeyable( false ); 179 | unitFn.setChannelBox( true ); 180 | addAttribute( MirrorPlane::top ); 181 | 182 | MirrorPlane::bottom = unitFn.create( "bottom", "bt", MFnUnitAttribute::kDistance, 1.0 ); 183 | unitFn.setHidden( false ); 184 | unitFn.setKeyable( false ); 185 | unitFn.setChannelBox( true ); 186 | addAttribute( MirrorPlane::bottom ); 187 | 188 | MirrorPlane::front = unitFn.create( "front", "ft", MFnUnitAttribute::kDistance, 1.0 ); 189 | unitFn.setHidden( false ); 190 | unitFn.setKeyable( false ); 191 | unitFn.setChannelBox( true ); 192 | addAttribute( MirrorPlane::front ); 193 | 194 | MirrorPlane::back = unitFn.create( "back", "bk", MFnUnitAttribute::kDistance, 1.0 ); 195 | unitFn.setHidden( false ); 196 | unitFn.setKeyable( false ); 197 | unitFn.setChannelBox( true ); 198 | addAttribute( MirrorPlane::back ); 199 | 200 | MirrorPlane::asType = enumFn.create( "asType", "at", 0 ); 201 | enumFn.addField( "locator", 0 ); 202 | enumFn.addField( "custom", 1 ); 203 | enumFn.setHidden( false ); 204 | enumFn.setKeyable( false ); 205 | enumFn.setChannelBox( true ); 206 | enumFn.setStorable( true ); 207 | addAttribute( MirrorPlane::asType ); 208 | 209 | return MS::kSuccess; 210 | } 211 | 212 | 213 | 214 | 215 | /* 216 | 217 | Viewport 2.0 Override 218 | 219 | */ 220 | MirrorPlaneOverride::MirrorPlaneOverride( const MObject& obj ) 221 | : MHWRender::MPxGeometryOverride( obj ) 222 | , mSolidUIShader( NULL ) 223 | , mLocatorNode( obj ) 224 | , newHyaline( 0.5f ) 225 | , newSize( 1.0f ) 226 | , newTop( 1.0f ) 227 | , newBottom( 1.0f ) 228 | , newFront( 1.0f ) 229 | , newBack( 1.0f ) 230 | , needRefresh( true ) 231 | { 232 | MHWRender::MRenderer* renderer = MHWRender::MRenderer::theRenderer(); 233 | if ( !renderer ) 234 | return; 235 | 236 | const MHWRender::MShaderManager* shaderMgr = renderer->getShaderManager(); 237 | if ( !shaderMgr ) 238 | return; 239 | 240 | mSolidUIShader = shaderMgr->getStockShader( MHWRender::MShaderManager::k3dSolidShader ); 241 | } 242 | 243 | 244 | MirrorPlaneOverride::~MirrorPlaneOverride() 245 | { 246 | if( mSolidUIShader ) 247 | { 248 | MHWRender::MRenderer* renderer = MHWRender::MRenderer::theRenderer(); 249 | if ( renderer ) 250 | { 251 | const MHWRender::MShaderManager* shaderMgr = renderer->getShaderManager(); 252 | if (shaderMgr) 253 | { 254 | shaderMgr->releaseShader( mSolidUIShader ); 255 | } 256 | } 257 | mSolidUIShader = NULL; 258 | } 259 | } 260 | 261 | 262 | MHWRender::DrawAPI MirrorPlaneOverride::supportedDrawAPIs() const 263 | { 264 | return ( MHWRender::kOpenGL | MHWRender::kDirectX11 | MHWRender::kOpenGLCoreProfile ); 265 | } 266 | 267 | 268 | const MString colorParameterName_ = "solidColor"; 269 | const MString wireframePlaneItemName_ = "mirrorPlaneWires"; 270 | const MString shadedPlaneItemName_ = "mirrorPlaneTriangles"; 271 | 272 | 273 | void MirrorPlaneOverride::updateDG() 274 | { 275 | 276 | MPlug hyalinePlug( mLocatorNode, MirrorPlane::hyaline ); 277 | newHyaline = (float)hyalinePlug.asFloat(); 278 | 279 | MPlug sizePlug( mLocatorNode, MirrorPlane::size ); 280 | MDistance sizeVal; 281 | sizePlug.getValue( sizeVal ); 282 | newSize = (float)sizeVal.asCentimeters(); 283 | 284 | MPlug topPlug( mLocatorNode, MirrorPlane::top ); 285 | MDistance topVal; 286 | topPlug.getValue( topVal ); 287 | newTop = (float)topVal.asCentimeters(); 288 | 289 | MPlug bottomPlug( mLocatorNode, MirrorPlane::bottom ); 290 | MDistance bottomVal; 291 | bottomPlug.getValue( bottomVal ); 292 | newBottom = (float)bottomVal.asCentimeters(); 293 | 294 | MPlug frontPlug( mLocatorNode, MirrorPlane::front ); 295 | MDistance frontVal; 296 | frontPlug.getValue( frontVal ); 297 | newFront = (float)frontVal.asCentimeters(); 298 | 299 | MPlug backPlug( mLocatorNode, MirrorPlane::back ); 300 | MDistance backVal; 301 | backPlug.getValue( backVal ); 302 | newBack = (float)backVal.asCentimeters(); 303 | 304 | needRefresh = true; 305 | } 306 | 307 | 308 | void MirrorPlaneOverride::updateRenderItems( const MDagPath& path, MHWRender::MRenderItemList& list ) 309 | { 310 | // MHWRender::MRenderItem* wireframePlane = NULL; 311 | // int index = list.indexOf( wireframePlaneItemName_ ); 312 | 313 | // if ( index < 0 ) 314 | // { 315 | // wireframePlane = MHWRender::MRenderItem::Create( wireframePlaneItemName_, 316 | // MHWRender::MRenderItem::DecorationItem, 317 | // MHWRender::MGeometry::kLineStrip ); 318 | // wireframePlane->setDrawMode( MHWRender::MGeometry::kWireframe ); 319 | // wireframePlane->depthPriority( 5 ); 320 | // list.append( wireframePlane ); 321 | // } 322 | // else 323 | // { 324 | // wireframePlane = list.itemAt( index ); 325 | // } 326 | // if(wireframePlane) 327 | // { 328 | // if ( mSolidUIShader ) 329 | // { 330 | // MColor color = MHWRender::MGeometryUtilities::wireframeColor( path ); 331 | // float wireframeColor[4] = { color.r, color.g, color.b, 1.0f }; 332 | // mSolidUIShader->setParameter( colorParameterName_, wireframeColor ); 333 | // wireframePlane->setShader( mSolidUIShader ); 334 | // } 335 | // wireframePlane->enable( false ); 336 | // } 337 | 338 | MHWRender::MRenderItem* shadedPlaneItem = NULL; 339 | int index = list.indexOf( shadedPlaneItemName_ ); 340 | if ( index < 0 ) 341 | { 342 | shadedPlaneItem = MHWRender::MRenderItem::Create( shadedPlaneItemName_, 343 | MHWRender::MRenderItem::DecorationItem, 344 | MHWRender::MGeometry::kTriangleStrip ); 345 | shadedPlaneItem->setDrawMode( MHWRender::MGeometry::kAll ); 346 | shadedPlaneItem->depthPriority( 5 ); 347 | list.append( shadedPlaneItem ); 348 | } 349 | else 350 | { 351 | shadedPlaneItem = list.itemAt( index ); 352 | } 353 | 354 | if( shadedPlaneItem ) 355 | { 356 | if ( mSolidUIShader ) 357 | { 358 | MColor color = MHWRender::MGeometryUtilities::wireframeColor( path ); 359 | float wireframeColor[4] = { color.r, color.g, color.b, 1.0f * newHyaline }; 360 | mSolidUIShader->setParameter( colorParameterName_, wireframeColor ); 361 | shadedPlaneItem->setShader( mSolidUIShader ); 362 | } 363 | shadedPlaneItem->enable( true ); 364 | } 365 | } 366 | 367 | 368 | void MirrorPlaneOverride::populateGeometry( const MHWRender::MGeometryRequirements &requirements, 369 | const MHWRender::MRenderItemList &renderItems, 370 | MHWRender::MGeometry &data ) 371 | { 372 | MHWRender::MVertexBuffer* verticesBuffer = NULL; 373 | float* vertices = NULL; 374 | const MHWRender::MVertexBufferDescriptorList& vertexBufferDescriptorList = requirements.vertexRequirements(); 375 | const int numberOfVertexRequirments = vertexBufferDescriptorList.length(); 376 | MHWRender::MVertexBufferDescriptor vertexBufferDescriptor; 377 | 378 | for ( int requirmentNumber=0; requirmentNumberacquire( 4 ); 395 | } 396 | } 397 | } 398 | break; 399 | 400 | default: 401 | break; 402 | } 403 | } 404 | 405 | MPlug localPositionXPlug( mLocatorNode, MirrorPlane::localPositionX ); 406 | MPlug localPositionYPlug( mLocatorNode, MirrorPlane::localPositionY ); 407 | MPlug localPositionZPlug( mLocatorNode, MirrorPlane::localPositionZ ); 408 | float lpx = localPositionXPlug.asFloat(); 409 | float lpy = localPositionYPlug.asFloat(); 410 | float lpz = localPositionZPlug.asFloat(); 411 | 412 | MPlug localScaleYPlug( mLocatorNode, MirrorPlane::localScaleY ); 413 | MPlug localScaleZPlug( mLocatorNode, MirrorPlane::localScaleZ ); 414 | float lsy = localScaleYPlug.asFloat(); 415 | float lsz = localScaleZPlug.asFloat(); 416 | 417 | vertices[0] = plane[0][0] + lpx; 418 | vertices[1] = plane[0][1] * newSize * newTop * lsy + lpy; 419 | vertices[2] = plane[0][2] * newSize * newFront * lsz + lpz; 420 | 421 | vertices[3] = plane[1][0] + lpx; 422 | vertices[4] = plane[1][1] * newSize * newBottom * lsy + lpy; 423 | vertices[5] = plane[1][2] * newSize * newFront * lsz + lpz; 424 | 425 | vertices[6] = plane[2][0] + lpx; 426 | vertices[7] = plane[2][1] * newSize * newBottom * lsy + lpy; 427 | vertices[8] = plane[2][2] * newSize * newBack * lsz + lpz; 428 | 429 | vertices[9] = plane[3][0] + lpx; 430 | vertices[10] = plane[3][1] * newSize * newTop * lsy + lpy; 431 | vertices[11] = plane[3][2] * newSize * newBack * lsz + lpz; 432 | 433 | if( verticesBuffer && vertices ) 434 | { 435 | verticesBuffer->commit( vertices ); 436 | } 437 | 438 | for ( int i=0; iacquire( numIndex ); 454 | for( int i = 0; i < numIndex; ) 455 | { 456 | if ( isWireFrame ) 457 | { 458 | indices[i] = startIndex + i; 459 | i++; 460 | } 461 | else 462 | { 463 | indices[i] = startIndex + i/2; 464 | if ( i+1 < numIndex ) 465 | indices[i+1] = endIndex - i/2; 466 | i += 2; 467 | } 468 | } 469 | indexBuffer->commit( indices ); 470 | item->associateWithIndexBuffer( indexBuffer ); 471 | } 472 | } 473 | needRefresh = false; 474 | } 475 | 476 | 477 | MStatus initializePlugin( MObject obj ) 478 | { 479 | MStatus status; 480 | MFnPlugin plugin( obj, AUTHOR_NAME, "3.0", "Any"); 481 | status = plugin.registerNode( PLUGIN_NODE_NAME, 482 | MirrorPlane::id, 483 | &MirrorPlane::creator, 484 | &MirrorPlane::initialize, 485 | MPxNode::kLocatorNode, 486 | &MirrorPlane::drawDbClassification ); 487 | if ( !status ) 488 | { 489 | status.perror( "registerNode" ); 490 | return status; 491 | } 492 | 493 | 494 | status = MHWRender::MDrawRegistry::registerGeometryOverrideCreator( MirrorPlane::drawDbClassification, 495 | MirrorPlane::drawRegistrantId, 496 | MirrorPlaneOverride::Creator ); 497 | if ( !status ) 498 | { 499 | status.perror( "registerDrawOverrideCreator" ); 500 | return status; 501 | } 502 | 503 | return status; 504 | } 505 | 506 | 507 | MStatus uninitializePlugin( MObject obj ) 508 | { 509 | MStatus status; 510 | MFnPlugin plugin( obj ); 511 | 512 | status = MHWRender::MDrawRegistry::deregisterGeometryOverrideCreator( MirrorPlane::drawDbClassification, 513 | MirrorPlane::drawRegistrantId ); 514 | 515 | if ( !status ) 516 | { 517 | status.perror( "deregisterDrawOverrideCreator" ); 518 | return status; 519 | } 520 | 521 | status = plugin.deregisterNode( MirrorPlane::id ); 522 | if ( !status ) 523 | { 524 | status.perror( "deregisterNode" ); 525 | return status; 526 | } 527 | return status; 528 | } 529 | -------------------------------------------------------------------------------- /source/mirrorPlane.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Author : astips 4 | 5 | Github : https://github.com/astips 6 | 7 | */ 8 | 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | // Viewport 2.0 includes 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | 34 | 35 | #define AUTHOR_NAME "astips" 36 | #define PLUGIN_NODE_NAME "mirrorPlane" 37 | 38 | 39 | class MirrorPlane : public MPxLocatorNode 40 | { 41 | public: 42 | MirrorPlane() {}; 43 | virtual ~MirrorPlane() {}; 44 | 45 | virtual bool isBounded() const { return true; } 46 | virtual bool isTransparent() const { return true; } 47 | virtual bool excludeAsLocator() const; 48 | virtual MBoundingBox boundingBox() const; 49 | 50 | virtual void draw( M3dView & view, 51 | const MDagPath & path, 52 | M3dView::DisplayStyle style, 53 | M3dView::DisplayStatus status ); 54 | 55 | static void * creator(); 56 | static MStatus initialize(); 57 | virtual MStatus compute( const MPlug& plug, MDataBlock& data ); 58 | 59 | public: 60 | static MTypeId id; 61 | 62 | static MObject hyaline; 63 | static MObject size; 64 | static MObject top; 65 | static MObject bottom; 66 | static MObject front; 67 | static MObject back; 68 | static MObject asType; 69 | 70 | static MString drawDbClassification; 71 | static MString drawRegistrantId; 72 | 73 | private: 74 | float unitValue( const MPlug& plug ); 75 | }; 76 | 77 | 78 | 79 | 80 | class MirrorPlaneOverride : public MHWRender::MPxGeometryOverride 81 | { 82 | public: 83 | static MHWRender::MPxGeometryOverride* Creator( const MObject& obj ) 84 | { 85 | return new MirrorPlaneOverride( obj ); 86 | } 87 | 88 | virtual ~MirrorPlaneOverride(); 89 | virtual MHWRender::DrawAPI supportedDrawAPIs() const; 90 | virtual bool hasUIDrawables() const { return false; } 91 | virtual void updateDG(); 92 | 93 | virtual bool isStreamDirty( const MHWRender::MVertexBufferDescriptor &desc ) { return needRefresh; } 94 | virtual bool isIndexingDirty( const MHWRender::MRenderItem &item ) { return false; } 95 | 96 | virtual void updateRenderItems( const MDagPath &path, MHWRender::MRenderItemList& list ); 97 | 98 | virtual void populateGeometry( const MHWRender::MGeometryRequirements &requirements, 99 | const MHWRender::MRenderItemList &renderItems, 100 | MHWRender::MGeometry &data ); 101 | virtual void cleanUp() {}; 102 | 103 | virtual bool traceCallSequence() const 104 | { 105 | return false; 106 | } 107 | 108 | virtual void handleTraceMessage( const MString &message ) const 109 | { 110 | MGlobal::displayInfo( "MirrorPlaneOverride: " + message ); 111 | fprintf( stderr, "MirrorPlaneOverride: " ); 112 | fprintf( stderr, message.asChar() ); 113 | fprintf( stderr, "\n" ); 114 | } 115 | 116 | private: 117 | MirrorPlaneOverride( const MObject& obj ); 118 | 119 | float newHyaline; 120 | float newSize; 121 | float newTop; 122 | float newBottom; 123 | float newFront; 124 | float newBack; 125 | 126 | bool needRefresh; 127 | 128 | MObject mLocatorNode; 129 | 130 | MHWRender::MShaderInstance* mSolidUIShader; 131 | }; 132 | --------------------------------------------------------------------------------