diff --git a/src/mayaToAppleseed/mtap_devmodule/resources/checker.jpeg b/src/mayaToAppleseed/mtap_devmodule/resources/checker.jpeg new file mode 100644 index 0000000..b837269 Binary files /dev/null and b/src/mayaToAppleseed/mtap_devmodule/resources/checker.jpeg differ diff --git a/src/mayaToAppleseed/mtap_devmodule/resources/swatchRender.xml b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRender.xml new file mode 100644 index 0000000..a4fdf34 --- /dev/null +++ b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRender.xml @@ -0,0 +1,458 @@ + + + + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/2015/plug-ins + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/surface + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/color + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/emission + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/maya + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/vector + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/texture3d + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/material + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/transparency + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/float + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/normal + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/transform + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/fresnel + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/input + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/texture2d + + + H:/UserDatenHaggi/Documents/coding/OpenMaya/src/mayaToAppleseed/mtap_devmodule/shaders/utility + + + + + + + + + + + + + + 1.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 0.026183956021985 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + 1.000000 1.000000 1.000000 + + + 1.000000 + + + + + + + 1.000000 1.000000 1.000000 + + + 1.000000 + + + + + + + 0.600000 0.700000 0.900000 + + + 1.000000 + + + + + + + 0.800000 0.800000 0.900000 + + + 1.000000 + + + + + + + 0.200000 0.300000 0.600000 + + + 1.000000 + + + + + + + + + + + + + + + + + + 0.500000 0.500000 0.500000 + + + 1.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + 2.880829495736127 0.026724595476459 0.008945042218900 -4.123433917033322 + 0.008330395258277 -1.681090976944390 2.339623160476478 4.373258714237430 + 0.026922523999788 -2.339485354628176 -1.681087818785416 6.591801961425044 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + 1.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + + + + + + 1.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + 0.909787924054713 -0.405999791405418 -0.086313976985035 -1.491024445174220 + 0.306617011548300 0.517210506202792 0.799048997560626 2.000398599224409 + -0.279771230603516 -0.753430462386681 0.595038315467488 -0.702855912829005 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + 1.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + 0.009999999776483 0.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.009999999776483 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 0.009999999776483 0.000000000000000 + 0.000000000000000 0.000000000000000 0.000000000000000 1.000000000000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderBg.binarymesh b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderBg.binarymesh new file mode 100644 index 0000000..e9de75e Binary files /dev/null and b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderBg.binarymesh differ diff --git a/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderMeshLight.binarymesh b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderMeshLight.binarymesh new file mode 100644 index 0000000..8ea3846 Binary files /dev/null and b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderMeshLight.binarymesh differ diff --git a/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderSphere.binarymesh b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderSphere.binarymesh new file mode 100644 index 0000000..c7ce772 Binary files /dev/null and b/src/mayaToAppleseed/mtap_devmodule/resources/swatchRenderSphere.binarymesh differ diff --git a/src/mayaToCorona/mtco_devmodule/resources/Config-703093.conf b/src/mayaToCorona/mtco_devmodule/resources/Config-703093.conf new file mode 100644 index 0000000..aa3699b --- /dev/null +++ b/src/mayaToCorona/mtco_devmodule/resources/Config-703093.conf @@ -0,0 +1,140 @@ +##################################################### +# Default Corona auto-generated initial config file # +# # +# format: # +# type name = value # +##################################################### + int system.drMaxDumpPixels = 500000 +string system.sceneReportFile = +string system.sceneExportPath = + int system.randomSampler = 3 + int system.randomSeed = 1234 + int system.numThreads = 0 + bool system.showPrevisualizations = true + bool system.minimizePrecomp = false + int system.vfbUpdateInterval = 1000 + int system.threadPriority = 0 + float geometry.shadowBias = -6.07 + int geometry.minInstanceSaving = 50000 + float geometry.maxNormalDiff = 0.55 + int geometry.accelerationStructure = 2 + bool geometry.embree.lowMemory = false + bool geometry.embree.highQuality = true + bool geometry.embree.precise = true + float geometry.bvh.costIteration = 1 + float geometry.bvh.costTriangle = 1 + int geometry.bvh.leafSizeMin = 2 + int geometry.bvh.leafSizeMax = 6 + int geometry.displace.subdivType = 0 + float geometry.displace.maxSizeScreen = 2 + float geometry.displace.maxSizeWorld = 1 + bool geometry.displace.filterMap = false + bool geometry.displace.smoothNormals = true + float geometry.displace.maxSizeScreenOutFrustumMultiplier = 100 + int progressive.passLimit = 0 + int progressive.timeLimit = 0 + int progressive.adaptivityInterval = 0 + float progressive.adaptivityAmount = 0 + int bucket.samplesPerIteration = 1 + int bucket.passes = 2 + float bucket.adaptiveThreshold = 0.03 + int bucket.size = 32 + bool bucket.showOrder = false + int image.width = 640 + int image.height = 480 + int image.region.startX = 0 + int image.region.startY = 0 + int image.region.endX = 0 + int image.region.endY = 0 + int image.internalResMult = 1 + int image.filter.type = 3 + float image.filter.width = 1.5 + float image.filter.blurring = 0.5 + float colorMap.gamma = 2.2 + float colorMap.highlightCompression = 1 + float colorMap.colorTemp = 6500 + float colorMap.contrast = 1 + bool colorMap.usePhotographic = false + float colorMap.simpleExposure = 0 + float colorMap.iso = 100 + float colorMap.fStop = 16 + float colorMap.shutterSpeed = 50 + Vec3 colorMap.tint = 1 1 1 + bool shading.enable = true + bool shading.enableAa = true + int shading.renderEngine = 2 + int shading.primarySolver = 1 + int shading.secondarySolver = 4 + float shading.maxSampleIntensity = 20 + int shading.giToAaRatio = 16 + float shading.firstPassQuality = 1 + Vec3 shading.exitColor = 0 0 0 + int shading.maxRayDepth = 25 + float lights.samplesMult = 2 + float lights.texturedRes = 0.3 + int lights.samplingMode = 2 + int lights.envResolution = 1000 + int lights.areaMethod = 2 + int lights.solver = 1 + int lights.enviroSolver = 0 + float lights.enviroSubdivThreshold = 0.005 + float lights.enviroDistance = 10000 + float lights.portalSampleFraction = 0.75 + float lights.solverFracLocal = 0.33 + float lights.solverFractGlobal = 0.33 + bool gi.ic.incrementalBuild = false +string gi.ic.incrementalFilename = incrementalIc.dat + int gi.ic.hemisphereSubdiv = 7 + float gi.ic.precompAmount = 1 + bool gi.ic.pathtracingCorners = true + float gi.ic.maxError = 0.6 + float gi.ic.smoothing = 1.8 + float gi.ic.colorThreshold = 10 + float gi.ic.recordSpacingMin = 1 + float gi.ic.recordSpacingMax = 20 + bool gi.ic.useRotGrad = true + bool gi.ic.useTransGrad = true + int gi.ic.interpolationSchema = 1 + int gi.ic.searchStructure = 0 + bool gi.ic.relaxedInterpolation = true + int gi.ic.viz = 2 + int gi.ic.minInterpSamples = 2 + float gi.hdCache.precompDensity = 1 + int gi.hdCache.interpolationCount = 3 + float gi.hdCache.dirSensitivity = 2 + float gi.hdCache.posSensitivity = 20 + float gi.hdCache.normalSensitivity = 3 + int gi.hdCache.recordQuality = 256 + float gi.hdCache.smoothing = 2 + float gi.hdCache.glossyThreshold = 0.9 + int gi.hdCache.maxRecords = 100000 + int gi.hdCache.writablePasses = 0 + bool gi.hdCache.save = false + int gi.hdCache.precalcMode = 0 +string gi.hdCache.file = C:/HdCache.hdc + bool gi.hdCache.doViz = false + float gi.uhdcache.precision = 1 + float gi.uhdcache.precompDensity = 1 + int gi.uhdcache.interpolationCount = 5 + int gi.uhdcache.recordQuality = 512 + float gi.uhdcache.normalSensitivity = 2 + float gi.uhdcache.dirSensitivity = 3 + float gi.uhdcache.glossThreshold = 0.9 + float gi.uhdcache.strictness = 0.075 + float gi.uhdcache.msi = 3 + bool gi.uhdcache.correlatePrecomp = true + int gi.photons.emitted = 5000000 + bool gi.photons.storeDirect = true + int gi.photons.depth = -1 + int gi.photons.lookupCount = 50 + int gi.photons.filter = 1 + int gi.vpl.emittedCount = 1000000 + int gi.vpl.usedCount = 150 + int gi.vpl.progressiveBatch = 150 + float gi.vpl.clamping = 50 + int gi.ppm.ptSamplesPerIter = 1 + int gi.ppm.photonsPerIter = 5000000 + float gi.ppm.alpha = 0.666 + float gi.ppm.initialRadius = 2 + bool gi.vcm.mis = true + int gi.vcm.mode = 4 diff --git a/src/mayaToCorona/mtco_devmodule/resources/releaseNotes.txt b/src/mayaToCorona/mtco_devmodule/resources/releaseNotes.txt index 7eb137e..d6c1b46 100644 --- a/src/mayaToCorona/mtco_devmodule/resources/releaseNotes.txt +++ b/src/mayaToCorona/mtco_devmodule/resources/releaseNotes.txt @@ -5,6 +5,8 @@ release 0.42 - fixed some physical sky problems - added area light render attributes - added texturing for area lights +- redesigned render globals UI +- added wire/AO/Sky shader release 0.41 - fixed a problem with esc key which caused a premature stop of the next rendering. diff --git a/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaAOTemplate.py b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaAOTemplate.py new file mode 100644 index 0000000..69b8bc9 --- /dev/null +++ b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaAOTemplate.py @@ -0,0 +1,54 @@ +import pymel.core as pm +import logging + +log = logging.getLogger("ui") + +class BaseTemplate(pm.ui.AETemplate): + + def addControl(self, control, label=None, **kwargs): + pm.ui.AETemplate.addControl(self, control, label=label, **kwargs) + + def beginLayout(self, name, collapse=True): + pm.ui.AETemplate.beginLayout(self, name, collapse=collapse) + + +class AECoronaAOTemplate(BaseTemplate): + def __init__(self, nodeName): + BaseTemplate.__init__(self,nodeName) + log.debug("AECoronaLightTemplate") + self.thisNode = None + self.node = pm.PyNode(self.nodeName) + pm.mel.AEswatchDisplay(nodeName) + self.beginScrollLayout() + self.buildBody(nodeName) + allAttributes = self.node.listAttr() + allowedAttributes = ["maxDist", "maxSamplesCount", "phongExponent", "mixExponent", "invert", "excludeMode", "useOffset", "offset"] + for att in allAttributes: + att = att.split(".")[-1] + if not att in allowedAttributes: + self.suppress(att) + self.addExtraControls("ExtraControls") + self.endScrollLayout() + + def updateUI(self, nodeName=None): + self.thisNode = pm.PyNode(nodeName) + self.dimControl(nodeName, "offset", True) + if self.thisNode.useOffset.get(): + self.dimControl(nodeName, "offset", False) + + def buildBody(self, nodeName): + self.thisNode = pm.PyNode(nodeName) + self.beginLayout("Ambient Occlusion" ,collapse=0) + self.beginNoOptimize() + self.addControl("maxDist", label="Max Dist") + self.addControl("maxSamplesCount", label="Max Samples") + self.addControl("phongExponent", label="Phong Exponent") + self.addControl("mixExponent", label="Mix Exponent") + self.addControl("invert", label="Invert") + self.addControl("excludeMode", label="Exclude Node") + self.addControl("useOffset", label="Use Offset", changeCommand=self.updateUI) + self.addControl("offset", label="Offset") + self.endNoOptimize() + self.endLayout() + self.updateUI(self.thisNode) + \ No newline at end of file diff --git a/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaFrontBackTemplate.py b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaFrontBackTemplate.py new file mode 100644 index 0000000..48228fd --- /dev/null +++ b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaFrontBackTemplate.py @@ -0,0 +1,50 @@ +import pymel.core as pm +import logging + +log = logging.getLogger("ui") + +class BaseTemplate(pm.ui.AETemplate): + + def addControl(self, control, label=None, **kwargs): + pm.ui.AETemplate.addControl(self, control, label=label, **kwargs) + + def beginLayout(self, name, collapse=True): + pm.ui.AETemplate.beginLayout(self, name, collapse=collapse) + + +class AECoronaFrontBackTemplate(BaseTemplate): + def __init__(self, nodeName): + BaseTemplate.__init__(self,nodeName) + log.debug("AECoronaLightTemplate") + self.thisNode = None + self.node = pm.PyNode(self.nodeName) + pm.mel.AEswatchDisplay(nodeName) + self.beginScrollLayout() + self.buildBody(nodeName) + allAttributes = self.node.listAttr() + allowedAttributes = ["frontMaterial", "backMaterial", "opacity"] + for att in allAttributes: + att = att.split(".")[-1] + if not att in allowedAttributes: + self.suppress(att) + self.addExtraControls("ExtraControls") + self.endScrollLayout() + + def buildBody(self, nodeName): + self.thisNode = pm.PyNode(nodeName) + self.beginLayout("Emission" ,collapse=0) + self.beginNoOptimize() + self.addControl("frontMaterial", label="Front Material") + self.addControl("backMaterial", label="Back Material") + self.addSeparator() + self.addControl("iesProfile", label="IES Profile") + self.addControl("emissionSharpnessFake", label="Sharp Patterns") + #self.addControl("emissionDisableSampling", label="Disable Sampling") + #self.addControl("emissionSharpnessFakePoint", label="Sharpness Fake Point") + self.endNoOptimize() + self.endLayout() + + #self.beginLayout("Hardware Texturing" ,collapse=0) + #pm.mel.eval('AEhardwareTextureTemplate "%s"' % self.nodeName + r'("diffuse emissionColor ")') + #self.endLayout() + \ No newline at end of file diff --git a/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaSkyTemplate.py b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaSkyTemplate.py new file mode 100644 index 0000000..7606186 --- /dev/null +++ b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaSkyTemplate.py @@ -0,0 +1,82 @@ +import pymel.core as pm +import logging + +log = logging.getLogger("ui") + +class BaseTemplate(pm.ui.AETemplate): + + def addControl(self, control, label=None, **kwargs): + pm.ui.AETemplate.addControl(self, control, label=label, **kwargs) + + def beginLayout(self, name, collapse=True): + pm.ui.AETemplate.beginLayout(self, name, collapse=collapse) + + +class AECoronaSkyTemplate(BaseTemplate): + def __init__(self, nodeName): + BaseTemplate.__init__(self,nodeName) + log.debug("AECoronaLightTemplate") + self.thisNode = None + self.node = pm.PyNode(self.nodeName) + pm.mel.AEswatchDisplay(nodeName) + self.beginScrollLayout() + self.buildBody(nodeName) + allAttributes = self.node.listAttr() + allowedAttributes = ["emissionColor", "emissionColorMultiplier", "opacity", "emitLight", "emissionGlossyness", "doubleSidedEmission", "iesProfile", "emissionSharpnessFake"] + for att in allAttributes: + att = att.split(".")[-1] + if not att in allowedAttributes: + print "Suppressing", att + self.suppress(att) + self.addExtraControls("ExtraControls") + self.endScrollLayout() + + def updateUI(self, nodeName): + self.thisNode = pm.PyNode(nodeName) + self.dimControl(self.thisNode, "pSkyPreethamTurb", True) + self.dimControl(self.thisNode, "pSkyZenith", True) + self.dimControl(self.thisNode, "pSkyHorizon", True) + self.dimControl(self.thisNode, "pSkySunGlow", True) + self.dimControl(self.thisNode, "pSkySunSideGlow", True) + self.dimControl(self.thisNode, "pSkySunBleed", True) + self.dimControl(self.thisNode, "pSkySunFalloff", True) + if (self.thisNode.pSkyModel.get() == 0) or (self.thisNode.pSkyModel.get() == 2): #preetham or hosek + self.dimControl(self.thisNode, "pSkyPreethamTurb", False) + if self.thisNode.pSkyModel.get() == 1: + self.dimControl(self.thisNode, "pSkyZenith", False) + self.dimControl(self.thisNode, "pSkyHorizon", False) + self.dimControl(self.thisNode, "pSkySunGlow", False) + self.dimControl(self.thisNode, "pSkySunSideGlow", False) + self.dimControl(self.thisNode, "pSkySunBleed", False) + self.dimControl(self.thisNode, "pSkySunFalloff", False) + + def buildBody(self, nodeName): + self.thisNode = pm.PyNode(nodeName) + self.beginLayout("Sky" ,collapse=0) + self.beginNoOptimize() + self.addControl("pSkyModel", label="Model", changeCommand=self.updateUI) + self.addSeparator() + self.addControl("pSkyMultiplier", label="Multiplier") + self.addControl("pSkyHorizBlur", label="Horizon Blur") + self.addControl("pSkyGroundColor", label="Ground Color") + self.addControl("pSkyAffectGround", label="Affect Ground") + self.addControl("sunSizeMulti", label="Sun Size Multiplier") + self.beginLayout("Rawafake" ,collapse=0) + self.addControl("pSkySunFalloff", label="Sun Falloff") + self.addControl("pSkyZenith", label="Zenit Color") + self.addControl("pSkyHorizon", label="Horizon Color") + self.addControl("pSkySunGlow", label="Sun Glow") + self.addControl("pSkySunSideGlow", label="Sun Side Glow") + self.addControl("pSkySunBleed", label="Sun Bleed") + self.endLayout() + self.beginLayout("Preetham/Hosek" ,collapse=0) + self.addControl("pSkyPreethamTurb", label="Turbidity") + self.endLayout() + + self.endNoOptimize() + self.endLayout() + + #self.beginLayout("Hardware Texturing" ,collapse=0) + #pm.mel.eval('AEhardwareTextureTemplate "%s"' % self.nodeName + r'("diffuse emissionColor ")') + #self.endLayout() + \ No newline at end of file diff --git a/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaWireTemplate.py b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaWireTemplate.py new file mode 100644 index 0000000..0f35363 --- /dev/null +++ b/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaWireTemplate.py @@ -0,0 +1,55 @@ +import pymel.core as pm +import logging + +log = logging.getLogger("ui") + +class BaseTemplate(pm.ui.AETemplate): + + def addControl(self, control, label=None, **kwargs): + pm.ui.AETemplate.addControl(self, control, label=label, **kwargs) + + def beginLayout(self, name, collapse=True): + pm.ui.AETemplate.beginLayout(self, name, collapse=collapse) + + +class AECoronaLightTemplate(BaseTemplate): + def __init__(self, nodeName): + BaseTemplate.__init__(self,nodeName) + log.debug("AECoronaLightTemplate") + self.thisNode = None + self.node = pm.PyNode(self.nodeName) + pm.mel.AEswatchDisplay(nodeName) + self.beginScrollLayout() + self.buildBody(nodeName) + allAttributes = self.node.listAttr() + allowedAttributes = ["emissionColor", "emissionColorMultiplier", "opacity", "emitLight", "emissionGlossyness", "doubleSidedEmission", "iesProfile", "emissionSharpnessFake"] + for att in allAttributes: + att = att.split(".")[-1] + if not att in allowedAttributes: + print "Suppressing", att + self.suppress(att) + self.addExtraControls("ExtraControls") + self.endScrollLayout() + + def buildBody(self, nodeName): + self.thisNode = pm.PyNode(nodeName) + self.beginLayout("Emission" ,collapse=0) + self.beginNoOptimize() + self.addControl("emissionColor", label="Color") + self.addControl("emissionColorMultiplier", label="Multiplier") + self.addControl("opacity", label="Opacity") + self.addControl("emitLight", label="Emit Light") + self.addControl("emissionGlossyness", label="Directionality") + self.addControl("doubleSidedEmission", label="Double Sided") + self.addSeparator() + self.addControl("iesProfile", label="IES Profile") + self.addControl("emissionSharpnessFake", label="Sharp Patterns") + #self.addControl("emissionDisableSampling", label="Disable Sampling") + #self.addControl("emissionSharpnessFakePoint", label="Sharpness Fake Point") + self.endNoOptimize() + self.endLayout() + + #self.beginLayout("Hardware Texturing" ,collapse=0) + #pm.mel.eval('AEhardwareTextureTemplate "%s"' % self.nodeName + r'("diffuse emissionColor ")') + #self.endLayout() + \ No newline at end of file diff --git a/src/mayaToCorona/mtco_devmodule/scripts/Corona/aeNodeTemplates.py b/src/mayaToCorona/mtco_devmodule/scripts/Corona/aeNodeTemplates.py index 8920a1e..a55cfdc 100644 --- a/src/mayaToCorona/mtco_devmodule/scripts/Corona/aeNodeTemplates.py +++ b/src/mayaToCorona/mtco_devmodule/scripts/Corona/aeNodeTemplates.py @@ -19,11 +19,29 @@ def __init__(self, nodeName): self.node = pm.PyNode(self.nodeName) self.buildBody(nodeName) log.debug("AECoronaNodeTemplate") - + + def updateSun(self, node = None): + thisLight = pm.PyNode(node) + + if thisLight.mtco_useAsSun.get(): + otherLights = [] + for light in pm.ls(type="directionalLight"): + if light.mtco_useAsSun.get() and (light != thisLight): + otherLights.append(light) + + if len(otherLights) > 0: + result = pm.confirmDialog(title="Sun Problem", message="Another Light already has sun activated, what should be done?", button=["Use This light", "Use Other Light"]) + if result == "Use This light": + for light in otherLights: + light.mtco_useAsSun.set(False) + else: + thisLight.mtco_useAsSun.set(False) + def buildDirLightTemplate(self, nodeName): self.thisNode = pm.PyNode(nodeName) self.beginLayout("Corona" ,collapse=1) - self.addControl("mtco_sun_multiplier", label="Sun Intensity Multiplier") + self.addControl("mtco_useAsSun", label="Use as Sun", changeCommand=self.updateSun) + #self.addControl("mtco_sun_multiplier", label="Sun Intensity Multiplier") self.endLayout() def buildAreaLightTemplate(self, nodeName): diff --git a/src/mayaToCorona/mtco_devmodule/scripts/mtco_initialize.py b/src/mayaToCorona/mtco_devmodule/scripts/mtco_initialize.py index b53422e..b1e45b6 100644 --- a/src/mayaToCorona/mtco_devmodule/scripts/mtco_initialize.py +++ b/src/mayaToCorona/mtco_devmodule/scripts/mtco_initialize.py @@ -167,61 +167,10 @@ def CoronaSceneCreateTab(self): self.addRenderGlobalsUIElement(attName = 'colorMapping_colorTemperature', uiType = 'float', displayName = 'Color Temperature', default='6500.0', data='minmax:1000.0:99999.0', uiDict=uiDict) self.addRenderGlobalsUIElement(attName = 'colorMapping_tint', uiType = 'color', displayName = 'Tint', default='1.0:1.0:1.0', uiDict=uiDict) self.addRenderGlobalsUIElement(attName = 'colorMapping_contrast', uiType = 'float', displayName = 'Contrast', default='1.0', data='minmax:1.0:99.0', uiDict=uiDict) - pm.separator() - - -# with pm.frameLayout(label="Raytrace Features", collapsable=True, collapse=True): -# with pm.columnLayout(self.rendererName + 'ColumnLayout', adjustableColumn=True, width=400): -# # self.addRenderGlobalsUIElement(attName = 'raycaster_minDepth', uiType = 'int', displayName = 'Min Ray Depth', default='0', data='minmax:0:25', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName='raycaster_maxDepth', uiType='int', displayName='Max Ray Depth', default='25', data='minmax:1:25', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName='color_exit', uiType='color', displayName='Exit Color', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName='system_maxNormalDev', uiType='float', displayName='Max Normal Diff', uiDict=uiDict) - -# with pm.frameLayout(label="Accerleration Structure", collapsable=True, collapse=True): -# with pm.columnLayout(self.rendererName + 'ColumnLayout', adjustableColumn=True, width=400): -# self.addRenderGlobalsUIElement(attName='accelerationStructure', uiType='enum', displayName='Accelerationstructure', default='Embree_bvh4_spatial', data='None:Embree_bvh4_spatial', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName='embree_triangles', uiType='enum', displayName='Triangles', default='Fast', data='Fast:Avx', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName='instance_minSize', uiType='int', displayName='Instance Min Size', default='1', data='minmax:1:999999', uiDict=uiDict) - # self.addRenderGlobalsUIElement(attName = 'bvh_cost_iteration', uiType = 'float', displayName = 'Bvh_cost_iteration', default='1.0', data='minmax:0.01:1000.0', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName = 'bvh_cost_triangle', uiType = 'float', displayName = 'Bvh_cost_triangle', default='1.0', data='minmax:0.01:1000.0', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName = 'bvh_leafSizeMin', uiType = 'int', displayName = 'Bvh_leafsizemin', default='2', data='minmax:1:1000', uiDict=uiDict) -# self.addRenderGlobalsUIElement(attName = 'bvh_leafSizeMax', uiType = 'int', displayName = 'Bvh_leafsizemax', default='6', data='minmax:2:1000', uiDict=uiDict) - with pm.frameLayout(label="Environment", collapsable=True, collapse=True): with pm.columnLayout(self.rendererName + 'ColumnLayout', adjustableColumn=True, width=400): - self.addRenderGlobalsUIElement(attName = 'bgType', uiType = 'enum', displayName = 'Background', default='0', data='Color/Image:PhysicalSky', uiDict=uiDict, callback=self.CoronaSceneUpdateTab) - envLightingFrame = None - physSkyFrame = None - physSkyPreetham = None - physSkyRawafake = None - with pm.frameLayout(label="Color/Image", collapsable=False) as envLightingFrame: - with pm.columnLayout(self.rendererName + 'ColumnLayout', adjustableColumn=True, width=400): - self.addRenderGlobalsUIElement(attName='bgColor', uiType='color', displayName='Main Environment', default='0.4:0.4:1.0', uiDict=uiDict) - with pm.frameLayout(label="Physical Sky", collapsable=True, collapse=False) as physSkyFrame: - with pm.columnLayout(self.rendererName + 'ColumnLayout', adjustableColumn=True, width=400): - self.addRenderGlobalsUIElement(attName = 'sunSizeMulti', uiType = 'float', displayName = 'Sun Size Multiplier', default='1.0', uiDict=uiDict) - pm.separator() - self.addRenderGlobalsUIElement(attName = 'pSkyModel', uiType = 'enum', displayName = 'Sky Model', default='0', data='Preetham:Rawafake:Hosek', uiDict=uiDict, callback=self.CoronaSceneUpdateTab) - self.addRenderGlobalsUIElement(attName = 'pSkyMultiplier', uiType = 'float', displayName = 'Sky Multiplier', default='1.0', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkyHorizBlur', uiType = 'float', displayName = 'Sky Horizon Blur', default='0.1', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkyGroundColor', uiType = 'color', displayName = 'Ground Color', default='0.25:0.25:0.25', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkyAffectGround', uiType = 'bool', displayName = 'Sky Affect Ground', default='true', uiDict=uiDict) - with pm.columnLayout(self.rendererName + 'ColumnLayoutphysSkyPreetham', adjustableColumn=True, width=400) as physSkyPreetham: - self.addRenderGlobalsUIElement(attName = 'pSkyPreethamTurb', uiType = 'float', displayName = 'Turbidity', default='2.5', uiDict=uiDict) - with pm.columnLayout(self.rendererName + 'ColumnLayoutphysSkyRawafake', adjustableColumn=True, width=400) as physSkyRawafake: - self.addRenderGlobalsUIElement(attName = 'pSkySunFalloff', uiType = 'float', displayName = 'Sun Falloff', default='3.0', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkyZenith', uiType = 'color', displayName = 'Zenith Color', default='0.1:0.1:0.5', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkyHorizon', uiType = 'color', displayName = 'Horizon Color', default='0.25:0.5:0.5', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkySunGlow', uiType = 'float', displayName = 'Sun Glow', default='1.0', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkySunSideGlow', uiType = 'float', displayName = 'Sun Side Glow', default='0.2', uiDict=uiDict) - self.addRenderGlobalsUIElement(attName = 'pSkySunBleed', uiType = 'float', displayName = 'Sun Bleed', default='1.0', uiDict=uiDict) - uiDict['envLightingFrame'] = envLightingFrame - uiDict['physSkyFrame'] = physSkyFrame - uiDict['physSkyPreetham'] = physSkyPreetham - uiDict['physSkyRawafake'] = physSkyRawafake - - #self.addRenderGlobalsUIElement(attName='useSunLightConnection', uiType='bool', displayName='Use Sun', uiDict=uiDict, callback=self.editSun) + self.addRenderGlobalsUIElement(attName= 'bgColor', uiType='color', displayName='Main Environment', default='0.4:0.4:1.0', uiDict=uiDict) self.addRenderGlobalsUIElement(attName = 'useGlobalDirectOverride', uiType = 'bool', displayName = 'Use Direct Override', default='false', uiDict=uiDict, callback=self.CoronaSceneUpdateTab) self.addRenderGlobalsUIElement(attName = 'globalDirectOverride', uiType = 'color', displayName = 'Direct Override', default='0.0:0.0:0.0', uiDict=uiDict) self.addRenderGlobalsUIElement(attName = 'useGlobalReflectionOverride', uiType = 'bool', displayName = 'Use Reflection Override', default='false', uiDict=uiDict, callback=self.CoronaSceneUpdateTab) @@ -293,29 +242,6 @@ def CoronaSceneUpdateTab(self, dummy=None): if self.renderGlobalsNode.colorMapping_useSimpleExposure.get(): uiDict['colorMapping_simpleExposure'].setEnable(True) - bgType = self.renderGlobalsNode.bgType.get() - if bgType == 0: # color/image - uiDict['envLightingFrame'].setEnable(True) - uiDict['envLightingFrame'].setManage(True) - uiDict['physSkyFrame'].setEnable(False) - uiDict['physSkyFrame'].setManage(False) - if bgType == 1: # color/image - uiDict['envLightingFrame'].setEnable(False) - uiDict['envLightingFrame'].setManage(False) - uiDict['physSkyFrame'].setManage(True) - uiDict['physSkyFrame'].setEnable(True) - pSkyModel = self.renderGlobalsNode.pSkyModel.get() - - if pSkyModel == 0: #preetham - uiDict['physSkyPreetham'].setEnable(True) - uiDict['physSkyRawafake'].setEnable(False) - if pSkyModel == 1: #Rawafake - uiDict['physSkyPreetham'].setEnable(False) - uiDict['physSkyRawafake'].setEnable(True) - if pSkyModel == 2: #hosek - uiDict['physSkyPreetham'].setEnable(False) - uiDict['physSkyRawafake'].setEnable(False) - uiDict['globalMaterialOverride'].setEnable(False) uiDict['globalDirectOverride'].setEnable(False) uiDict['globalReflectionOverride'].setEnable(False) @@ -645,6 +571,7 @@ def registerNodeExtensions(self): # exponent for sun light pm.addExtension(nodeType="directionalLight", longName="mtco_sun_multiplier", attributeType="float", defaultValue=1.0) + pm.addExtension(nodeType="directionalLight", longName="mtco_useAsSun", attributeType="bool", defaultValue=False) pm.addExtension( nodeType='areaLight', longName='mtco_envPortal', attributeType='bool', defaultValue=False) pm.addExtension( nodeType='areaLight', longName='mtco_areaVisible', attributeType='bool', defaultValue=True) pm.addExtension( nodeType='areaLight', longName='mtco_doubleSided', attributeType='bool', defaultValue=False) @@ -664,11 +591,12 @@ def registerNodeExtensions(self): # gamma pm.addExtension( nodeType='file', longName='fromSRGB', attributeType='bool', defaultValue=True) pm.addExtension( nodeType='file', longName='toSRGB', attributeType='bool', defaultValue=False) - pm.addExtension( nodeType='file', longName='textureFilter', attributeType='enum', enumName="SmartCubic:Cubic:Triangle:Box", defaultValue = 0.0) + pm.addExtension( nodeType='file', longName='textureFilter', attributeType='enum', enumName="Bilinear:Bicubic:Nearest", defaultValue = 0.0) pm.addExtension( nodeType='file', longName='textureBlur', attributeType='float', defaultValue=0.0) pm.addExtension( nodeType='file', longName='textureSblur', attributeType='float', defaultValue=0.0) pm.addExtension( nodeType='file', longName='textureTblur', attributeType='float', defaultValue=0.0) pm.addExtension( nodeType='file', longName='textureFilterWidth', attributeType='float', defaultValue=1.0) + pm.addExtension( nodeType='file', longName='environmentMappingType', attributeType='enum', enumName="Spherical:Screen", defaultValue = 0.0) #mesh pm.addExtension( nodeType='mesh', longName='mtco_visibleInGI', attributeType='bool', defaultValue=True) @@ -714,14 +642,25 @@ def connectNodeToNodeOverrideCallback(self, srcNode, destNode): def createRenderNode(self, nodeType=None, postCommand=None): log.debug("createRenderNode callback for renderer {0} with node: {1}".format(self.rendererName.lower(), nodeType)) - mat = pm.shadingNode(nodeType, asShader=True) - shadingGroup = pm.sets(renderable=True, noSurfaceShader=True, empty=True, name="{0}SG".format(mat)) - mat.outColor >> shadingGroup.surfaceShader + nodeClass = None + for cl in pm.getClassification(nodeType): + if "corona/material" in cl: + nodeClass = "shader" + if "corona/texture" in cl: + nodeClass = "texture" + + if nodeClass == "shader": + mat = pm.shadingNode(nodeType, asShader=True) + shadingGroup = pm.sets(renderable=True, noSurfaceShader=True, empty=True, name="{0}SG".format(mat)) + mat.outColor >> shadingGroup.surfaceShader + else: + mat = pm.shadingNode(nodeType, asTexture=True) + if postCommand is not None: postCommand = postCommand.replace("%node", str(mat)) postCommand = postCommand.replace("%type", '\"\"') pm.mel.eval(postCommand) - return mat + return "" def renderProcedure(self, width, height, doShadows, doGlow, camera, options): log.debug("renderProcedure") diff --git a/src/mayaToCorona/src/Corona/Corona.cpp b/src/mayaToCorona/src/Corona/Corona.cpp index 6f1d76c..d72664c 100644 --- a/src/mayaToCorona/src/Corona/Corona.cpp +++ b/src/mayaToCorona/src/Corona/Corona.cpp @@ -12,10 +12,6 @@ #include "CoronaShaders.h" #include -//#include "CoronaTestScene.h" - -static Logging logger; - CoronaRenderer::CoronaRenderer() { MStatus stat; @@ -30,40 +26,42 @@ CoronaRenderer::CoronaRenderer() MObject renderGlobalsNode = getRenderGlobalsNode(); this->renderFbGlobalsNodeCallbackId = 0; this->renderFbGlobalsNodeCallbackId = MNodeMessage::addNodeDirtyCallback(renderGlobalsNode, CoronaRenderer::frameBufferInteractiveCallback, nullptr, &stat); - - int numP = Corona::PropertyDescriptor::descriptorsCount(); - Logging::debug("Property descriptiors:"); - for (uint i = 0; i < 2000; i++) - { - const Corona::PropertyDescriptor* pd = Corona::PropertyDescriptor::get(i); - if (pd) - { - MString ts; - Corona::Abstract::Settings::Property prop = pd->valueDefault; - if (pd->type == Corona::PropertyType::T_BOOL) - { - bool b = prop; - ts += MString(" BOOL ") + b; - } - if (pd->type == Corona::PropertyType::T_FLOAT) - { - float f = prop; - ts += MString(" FLOAT ") + f; - } - if (pd->type == Corona::PropertyType::T_INT) - { - int f = prop; - ts += MString(" INT ") + f; - } - if (pd->type == Corona::PropertyType::T_STR) - { - Corona::String f = prop; - ts += MString(" STRING ") + f.cStr(); - } - Logging::debug(MString("Descriptor: ") + pd->name.cStr() + " id " + i + ts); - - } - } + this->oslRenderer = new OSL::OSLShadingNetworkRenderer(); + this->oslRenderer->setup(); + + //int numP = Corona::PropertyDescriptor::descriptorsCount(); + //Logging::debug("Property descriptiors:"); + //for (uint i = 0; i < 2000; i++) + //{ + // const Corona::PropertyDescriptor* pd = Corona::PropertyDescriptor::get(i); + // if (pd) + // { + // MString ts; + // Corona::Abstract::Settings::Property prop = pd->valueDefault; + // if (pd->type == Corona::PropertyType::T_BOOL) + // { + // bool b = prop; + // ts += MString(" BOOL ") + b; + // } + // if (pd->type == Corona::PropertyType::T_FLOAT) + // { + // float f = prop; + // ts += MString(" FLOAT ") + f; + // } + // if (pd->type == Corona::PropertyType::T_INT) + // { + // int f = prop; + // ts += MString(" INT ") + f; + // } + // if (pd->type == Corona::PropertyType::T_STR) + // { + // Corona::String f = prop; + // ts += MString(" STRING ") + f.cStr(); + // } + // Logging::debug(MString("Descriptor: ") + pd->name.cStr() + " id " + i + ts); + + // } + //} } CoronaRenderer::~CoronaRenderer() @@ -102,6 +100,9 @@ CoronaRenderer::~CoronaRenderer() delete context.colorMappingData; context.colorMappingData = nullptr; } + + clearDataList(); + delete this->oslRenderer; } void CoronaRenderer::frameBufferInteractiveCallback(MObject& node, void *clientData) @@ -156,7 +157,6 @@ void CoronaRenderer::render() MGlobal::displayError(MString("Sorry! Could not get a valid license.") + reason); return; } - context.scene = context.core->createScene(); //createTestScene(); @@ -275,9 +275,9 @@ void CoronaRenderer::initializeRenderer() context.logger = new mtco_Logger(context.core); context.colorMappingData = new Corona::ColorMappingData; - if (gFn.findPlug("useCoronaVFB").asBool()) - if (MGlobal::mayaState() != MGlobal::kBatch) - vfbCallbacks.core = context.core; + //if (gFn.findPlug("useCoronaVFB").asBool()) + // if (MGlobal::mayaState() != MGlobal::kBatch) + // vfbCallbacks.core = context.core; ConfParser parser; Corona::String resPath = (getRendererHome() + "resources/").asChar(); @@ -291,37 +291,27 @@ void CoronaRenderer::initializeRenderer() context.fb->initFb(context.settings, context.renderPasses); context.core->sanityCheck(context.settings); - if (gFn.findPlug("useCoronaVFB").asBool()) - if (MGlobal::mayaState() != MGlobal::kBatch) - context.core->getWxVfb().renderStarted(context.fb, &vfbCallbacks, IWxVfb::EnviroConfig()); + //if (gFn.findPlug("useCoronaVFB").asBool()) + // if (MGlobal::mayaState() != MGlobal::kBatch) + // context.core->getWxVfb().renderStarted(context.fb, &vfbCallbacks, IWxVfb::EnviroConfig()); // this can be extracted and placed in a button function in the render globals - std::shared_ptr renderGlobals = MayaTo::getWorldPtr()->worldRenderGlobalsPtr; - MFnDependencyNode renderGlobalsNode(getRenderGlobalsNode()); - Corona::String dumpFilename = (renderGlobals->getImageOutputFile() + ".dmp").asChar(); - if (getBoolAttr("dumpAndResume", renderGlobalsNode, false)) - { - context.settings->set(Corona::PARAM_RANDOM_SEED, 0); - if (!context.fb->accumulateFromExr(dumpFilename)) - { - Logging::debug(MString("Accumulating from a dumpfile failed: ") + dumpFilename.cStr()); - } - else{ - // random seed has to be 0 for resuming a render - context.settings->set(Corona::PARAM_RESUME_RENDERING, true); - context.settings->set(Corona::PARAM_RANDOM_SEED, 0); - } - } - - OSL::OSLShadingNetworkRenderer *r = (OSL::OSLShadingNetworkRenderer *)MayaTo::getWorldPtr()->getObjPtr("oslRenderer"); - if (r == nullptr) - { - Logging::debug("error CoronaRenderer::render: OSL renderer == nullptr"); - return; - } - this->oslRenderer = r; - r->setup(); // delete existing shadingsys and reinit all - + //std::shared_ptr renderGlobals = MayaTo::getWorldPtr()->worldRenderGlobalsPtr; + //MFnDependencyNode renderGlobalsNode(getRenderGlobalsNode()); + //Corona::String dumpFilename = (renderGlobals->getImageOutputFile() + ".dmp").asChar(); + //if (getBoolAttr("dumpAndResume", renderGlobalsNode, false)) + //{ + // context.settings->set(Corona::PARAM_RANDOM_SEED, 0); + // if (!context.fb->accumulateFromExr(dumpFilename)) + // { + // Logging::debug(MString("Accumulating from a dumpfile failed: ") + dumpFilename.cStr()); + // } + // else{ + // // random seed has to be 0 for resuming a render + // context.settings->set(Corona::PARAM_RESUME_RENDERING, true); + // context.settings->set(Corona::PARAM_RANDOM_SEED, 0); + // } + //} } void CoronaRenderer::unInitializeRenderer() diff --git a/src/mayaToCorona/src/Corona/Corona.h b/src/mayaToCorona/src/Corona/Corona.h index 4ae307b..d2e5814 100644 --- a/src/mayaToCorona/src/Corona/Corona.h +++ b/src/mayaToCorona/src/Corona/Corona.h @@ -103,7 +103,11 @@ class mtco_Logger : public Corona::Abstract::Logger mtco_Logger(Corona::ICore* core) : Corona::Abstract::Logger(&core->getStats()) { }; - virtual void logMsg(const Corona::String& message, const Corona::LogType type) + virtual void logMsg(const Corona::String& message, const Corona::LogType type) + { + Logging::info(MString("Message: ") + message.cStr()); + } + virtual void logMsg(const Corona::String& message, const Corona::LogType type, const int errorCategory = 0) { Logging::info(MString("Message: ") + message.cStr()); } @@ -131,7 +135,7 @@ class CoronaRenderer : public MayaTo::Renderer OSL::OSLShadingNetworkRenderer *oslRenderer; Context context; - CornoaVfbCallbacks vfbCallbacks; + //CornoaVfbCallbacks vfbCallbacks; CoronaRenderer(); virtual ~CoronaRenderer(); @@ -157,7 +161,7 @@ class CoronaRenderer : public MayaTo::Renderer void setRenderStats(Corona::IMaterialSet& ms, std::shared_ptr obj); bool assingExistingMat(MObject shadingGroup, std::shared_ptr obj); void clearMaterialLists(); - void defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, Corona::NativeMtlData& data); + //void defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, Corona::NativeMtlData& data); Corona::IGeometryGroup* getGeometryPointer(std::shared_ptr obj); bool isSunLight(std::shared_ptr obj); virtual void defineLights(); diff --git a/src/mayaToCorona/src/Corona/CoronaAOShader.h b/src/mayaToCorona/src/Corona/CoronaAOShader.h index a2c4c68..8ff8462 100644 --- a/src/mayaToCorona/src/Corona/CoronaAOShader.h +++ b/src/mayaToCorona/src/Corona/CoronaAOShader.h @@ -1,6 +1,7 @@ #ifndef CORONA_AO_MAP #define CORONA_AO_MAP +#include #include "CoronaCore/api/Api.h" #include "CoronaCore/misc/Shaders/AoShader.h" @@ -10,12 +11,16 @@ class AoMap : public Corona::Abstract::Map, Corona::AoShader AoMap(MObject sObject); ~AoMap(); float maxDist; + Corona::String mapName = "AoMap"; virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); virtual Corona::Dir evalBump(const Corona::IShadeContext&, Corona::TextureCache*); virtual void renderTo(Corona::Bitmap& output); virtual void getChildren(Corona::Stack&) {} + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { return true; }; + virtual Corona::String name() const { return mapName; }; + }; diff --git a/src/mayaToCorona/src/Corona/CoronaCamera.cpp b/src/mayaToCorona/src/Corona/CoronaCamera.cpp index b66b8b7..8587967 100644 --- a/src/mayaToCorona/src/Corona/CoronaCamera.cpp +++ b/src/mayaToCorona/src/Corona/CoronaCamera.cpp @@ -1,4 +1,5 @@ #include "Corona.h" +#include "CoronaCamera.h" #include #include #include "renderGlobals.h" @@ -11,6 +12,128 @@ static Logging logger; +void updateCamera(Corona::CameraData& cameraData, MObject& cameraObject, const MMatrix& matrix, float deviceAspect) +{ + //MVector cameraUpVector(0.0, 1.0, 0.0); + MVector cameraUpVector(0.0, -1.0, 0.0); + MFnCamera camFn(cameraObject); + MPoint pos, rot, scale; + MMatrix camMatrix = matrix * MayaTo::getWorldPtr()->globalConversionMatrix; + cameraUpVector *= camMatrix; + cameraUpVector.normalize(); + Corona::Dir upVector(cameraUpVector.x, cameraUpVector.y, cameraUpVector.z); + getMatrixComponents(camMatrix, pos, rot, scale); + Corona::Pos cpos(pos.x, pos.y, pos.z); + + float horizontalFilmAperture = getFloatAttr("horizontalFilmAperture", camFn, 1.0f); + float verticalFilmAperture = getFloatAttr("verticalFilmAperture", camFn, 35.0f); + float focalLength = getFloatAttr("focalLength", camFn, 55.0f); + bool dof = getBoolAttr("depthOfField", camFn, false); + float focusDistance = getFloatAttr("focusDistance", camFn, 100.f); + float fStop = getFloatAttr("fStop", camFn, 5.6f); + float coi = getFloatAttr("centerOfInterest", camFn, 100.0f); + focusDistance *= MayaTo::getWorldPtr()->scaleFactor; + MPoint coiBase(0, 0, -coi); + MPoint coiTransform = coiBase * camMatrix; + Corona::Pos center(coiTransform.x, coiTransform.y, coiTransform.z); + float factor = horizontalFilmAperture; + float fov = 2.0 * atan((factor * 0.5f) / (focalLength * 0.03937)); // make horizontal film fit the default + MFnCamera::FilmFit filmFit = camFn.filmFit(); + float dAspect = deviceAspect; + double fAspect = horizontalFilmAperture / verticalFilmAperture; + + switch (filmFit) + { + case MFnCamera::kHorizontalFilmFit: + { + fov = 2.0 * atan((factor * 0.5f) / (focalLength * 0.03937)); + } + break; + + case MFnCamera::kVerticalFilmFit: + { + factor = verticalFilmAperture * dAspect; + fov = 2.0 * atan((factor * 0.5f) / (focalLength * 0.03937)); + } + break; + + case MFnCamera::kFillFilmFit: + {} + break; + + case MFnCamera::kOverscanFilmFit: + {} + break; + + default: + break; + } + + float fovDeg = fov * 57.29578; + Corona::AnimatedFloat fieldOfView(fov); + bool orthographic = getBoolAttr("orthographic", camFn, false); + + if (orthographic) + { + Corona::AnimatedAffineTm tm; + tm.setSegments(0); + tm[0] = Corona::AffineTm::IDENTITY; + cameraData.createOrtho(tm, 10.0f); + } + else{ + cameraData.createPerspective(Corona::AnimatedPos(cpos), Corona::AnimatedPos(center), Corona::AnimatedDir(upVector), fieldOfView); + } + cameraData.spherical.roll = Corona::AnimatedDir(upVector); + cameraData.cylindrical.roll = Corona::AnimatedDir(upVector); + cameraData.cylindrical.height = 1.0f; + int projType = getEnumInt("mtco_cameraType", camFn); + //CameraProjectionType + cameraData.type = Corona::PROJECTION_PERSPECTIVE; + if (projType == 1) + cameraData.type = Corona::PROJECTION_CYLINDRICAL; + if (projType == 2) + cameraData.type = Corona::PROJECTION_SPHERICAL; + + Corona::AnimatedFloat focalDist(focusDistance); + cameraData.perspective.focalDist = focalDist; + cameraData.perspective.fStop = fStop; + cameraData.perspective.filmWidth = MayaTo::getWorldPtr()->toMillimeters(horizontalFilmAperture * 2.54f * 10.0f); //film width in mm + + if (!getBoolAttr("bestFitClippingPlanes", camFn, false)) + { + cameraData.distances.minimal = getFloatAttr("nearClipPlane", camFn, 0.001f) * MayaTo::getWorldPtr()->scaleFactor; + cameraData.distances.maximal = getFloatAttr("farClipPlane", camFn, 100000.0f) * MayaTo::getWorldPtr()->scaleFactor; + } + + if (getBoolAttr("mtco_useBokeh", camFn, false)) + { + cameraData.perspective.bokeh.use = true; + cameraData.perspective.bokeh.blades = getIntAttr("mtco_blades", camFn, 6); + cameraData.perspective.bokeh.bladesRotation = getIntAttr("mtco_bladeRotation", camFn, 0.0); + MPlug bokehBitMapPlug = camFn.findPlug("mtco_bokehBitmap"); + if (!bokehBitMapPlug.isNull()) + { + if (bokehBitMapPlug.isConnected()) + { + MObject bitmapNode = getConnectedInNode(bokehBitMapPlug); + if (bitmapNode.hasFn(MFn::kFileTexture)) + { + MFnDependencyNode bitMapFn(bitmapNode); + MPlug texNamePlug = bitMapFn.findPlug("fileTextureName"); + if (!texNamePlug.isNull()) + { + MString fileName = texNamePlug.asString(); + Logging::debug(MString("Found bokeh bitmap file: ") + fileName); + Corona::Bitmap bokehBitmap; + Corona::loadImage(fileName.asChar(), bokehBitmap); + cameraData.perspective.bokeh.customShape = bokehBitmap; + } + } + } + } + } +} + void CoronaRenderer::defineCamera() { MPoint rot, pos, scale; diff --git a/src/mayaToCorona/src/Corona/CoronaCamera.h b/src/mayaToCorona/src/Corona/CoronaCamera.h new file mode 100644 index 0000000..1dc61af --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaCamera.h @@ -0,0 +1,5 @@ +#include +#include "CoronaCore/api/Api.h" + +void updateCamera(Corona::CameraData& camera, MObject& cameraObject, const MMatrix& matrix, float deviceAspect); + diff --git a/src/mayaToCorona/src/Corona/CoronaEnvironment.cpp b/src/mayaToCorona/src/Corona/CoronaEnvironment.cpp index 1a503d4..e6c4dba 100644 --- a/src/mayaToCorona/src/Corona/CoronaEnvironment.cpp +++ b/src/mayaToCorona/src/Corona/CoronaEnvironment.cpp @@ -21,8 +21,48 @@ void CoronaRenderer::defineEnvironment() { MFnDependencyNode depFn(getRenderGlobalsNode()); Corona::Rgb bgRgb = toCorona(getColorAttr("bgColor", depFn)); - int bgType = getEnumInt("bgType", depFn); - if (bgType == 0) + + + if (depFn.findPlug("globalVolume").isConnected()) + { + Logging::debug("globalVolume is connected."); + MPlugArray plugArray; + MPlug gv = depFn.findPlug("globalVolume"); + gv.connectedTo(plugArray, true, false); + if (plugArray.length() > 0) + { + Logging::debug(MString("Connected plug: ") + plugArray[0].name()); + MFnDependencyNode sourceNode(plugArray[0].node()); + if (sourceNode.typeName() == "CoronaVolume") + { + Logging::debug(MString("Connected node is from type CoronaVolume: ") + sourceNode.name()); + this->context.scene->setGlobalMedium(defineCoronaMaterial(sourceNode.object(), nullptr)); + } + } + } + + // set background + if (!isConnected("bgColor", depFn.object(), true)) + { + this->context.scene->setBackground(Corona::ColorOrMap(bgRgb, nullptr)); + return; + } + + MObject inObj = getConnectedInNode(depFn.object(), "bgColor"); + if (inObj == MObject::kNullObj) + { + Logging::error(MString("Unable to get connected element for renderGlobals.bgColor attribute")); + return; + } + // at the moment we are restricted to two possibilites: sky map or fileTexture + MFnDependencyNode inDepFn(inObj); + if((inDepFn.typeName() != "CoronaSky") && (!inObj.hasFn(MFn::kFileTexture))) + { + Logging::error(MString("Connections to bgColor attribute of type: ") + inDepFn.typeName() + " are not yet supported"); + return; + } + + if (inObj.hasFn(MFn::kFileTexture)) { MString texName; MObject fileTextureObject; @@ -36,11 +76,8 @@ void CoronaRenderer::defineEnvironment() return; } - //MObject obj = objectFromName(MString("coronaGlobals")); - //const Corona::ColorOrMap com = defineAttribute(MString("bgColor"), obj); - //this->context.scene->setBackground(com); + mtco_MapLoader loader(fileTextureObject); - mtco_MapLoader loader; if (fileTextureObject != MObject::kNullObj) { MFnDependencyNode fileNode(fileTextureObject); @@ -63,51 +100,13 @@ void CoronaRenderer::defineEnvironment() this->context.scene->setBackground(Corona::ColorOrMap(bgRgb, nullptr)); } } - if (bgType == 1) + + if (inDepFn.typeName() == "CoronaSky") { - SkyMap *texmap = new SkyMap; - texmap->coronaRenderer = this; - texmap->params->multiplier = getFloatAttr("pSkyMultiplier", depFn, 1.0); - int skyModel = getEnumInt("pSkyModel", depFn); - if (skyModel == 0) - texmap->params->mode = Corona::SkyModelType::MODEL_PREETHAM; - if (skyModel == 1) - texmap->params->mode = Corona::SkyModelType::MODEL_RAWAFAKE; - if (skyModel == 2) - texmap->params->mode = Corona::SkyModelType::MODEL_HOSEK; - texmap->params->groundColor = toCorona(getColorAttr("pSkyGroundColor", depFn)); - texmap->params->horizonBlur = getFloatAttr("pSkyHorizBlur", depFn, .1f); - texmap->params->skyAffectGround = getBoolAttr("pSkyAffectGround", depFn, true); - texmap->params->preetham.turbidity = getFloatAttr("pSkyPreethamTurb", depFn, 2.5f); - texmap->params->rawafake.horizon = toCorona(getColorAttr("pSkyHorizon", depFn)); - texmap->params->rawafake.horizon = toCorona(getColorAttr("pSkyZenith", depFn)); - texmap->params->rawafake.sunBleed = getFloatAttr("pSkySunBleed", depFn, 1.0f); - texmap->params->rawafake.sunFalloff = getFloatAttr("pSkySunFalloff", depFn, 3.0f); - texmap->params->rawafake.sunGlow = getFloatAttr("pSkySunGlow", depFn, 1.0f); - texmap->params->rawafake.sunSideGlow = getFloatAttr("pSkySunSideGlow", depFn, .2f); - texmap->initSky(); + SkyMap *texmap = new SkyMap(inDepFn.object()); this->context.scene->setBackground(Corona::ColorOrMap(bgRgb, texmap)); } - // set global volume environment - if (depFn.findPlug("globalVolume").isConnected()) - { - Logging::debug("globalVolume is connected."); - MPlugArray plugArray; - MPlug gv = depFn.findPlug("globalVolume"); - gv.connectedTo(plugArray, true, false); - if (plugArray.length() > 0) - { - Logging::debug(MString("Connected plug: ") + plugArray[0].name()); - MFnDependencyNode sourceNode(plugArray[0].node()); - if (sourceNode.typeName() == "CoronaVolume") - { - Logging::debug(MString("Connected node is from type CoronaVolume: ") + sourceNode.name()); - this->context.scene->setGlobalMedium(defineCoronaMaterial(sourceNode.object(), nullptr)); - } - } - } - // } diff --git a/src/mayaToCorona/src/Corona/CoronaFrontBack.cpp b/src/mayaToCorona/src/Corona/CoronaFrontBack.cpp new file mode 100644 index 0000000..efe5bf2 --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaFrontBack.cpp @@ -0,0 +1,34 @@ +#include "Corona.h" +#include "CoronaFrontBack.h" +#include +#include "utilities/attrTools.h" + +FrontBackMap::FrontBackMap(MObject shaderObject) +{ + MFnDependencyNode depFn(shaderObject); +}; + +FrontBackMap::~FrontBackMap(){}; + +Corona::Rgb FrontBackMap::evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) +{ + outAlpha = 1.0f; + float f = 1.0f; + return Corona::Rgb(f, f, f); +} + +float FrontBackMap::evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) +{ + return evalColor(context, cache, outAlpha).grayValue(); +} + +Corona::Dir FrontBackMap::evalBump(const Corona::IShadeContext&, Corona::TextureCache*) +{ + STOP; //currently not supported +} + +void FrontBackMap::renderTo(Corona::Bitmap& output) +{ + STOP; //currently not supported +} + diff --git a/src/mayaToCorona/src/Corona/CoronaFrontBack.h b/src/mayaToCorona/src/Corona/CoronaFrontBack.h new file mode 100644 index 0000000..8bc684c --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaFrontBack.h @@ -0,0 +1,23 @@ +#ifndef CORONA_FRONTBACK_MAP +#define CORONA_FRONTBACK_MAP + +#include +#include "CoronaCore/api/Api.h" + +class FrontBackMap : public Corona::Abstract::Map +{ +public: + FrontBackMap(MObject sObject); + ~FrontBackMap(); + Corona::String mapName = "FrontBackMap"; + virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); + virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); + virtual Corona::Dir evalBump(const Corona::IShadeContext&, Corona::TextureCache*); + virtual void renderTo(Corona::Bitmap& output); + virtual void getChildren(Corona::Stack&) {} + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { return true; }; + virtual Corona::String name() const { return mapName; }; +}; + + +#endif \ No newline at end of file diff --git a/src/mayaToCorona/src/Corona/CoronaGeometry.cpp b/src/mayaToCorona/src/Corona/CoronaGeometry.cpp index 0c666b5..e43569f 100644 --- a/src/mayaToCorona/src/Corona/CoronaGeometry.cpp +++ b/src/mayaToCorona/src/Corona/CoronaGeometry.cpp @@ -1,6 +1,7 @@ #include #include "Corona.h" +#include "CoronaGeometry.h" #include #include "maya/MFnMesh.h" #include "maya/MFnMeshData.h" @@ -15,6 +16,7 @@ #include "utilities/logging.h" #include "utilities/tools.h" #include "utilities/attrTools.h" +#include "utilities/meshTools.h" #include "mayaScene.h" #include "../mtco_common/mtco_mayaObject.h" #include "shadingtools/shadingUtils.h" @@ -25,6 +27,55 @@ static Logging logger; +void defineStdPlane(Corona::IGeometryGroup *geom) +{ + geom->getVertices().push(Corona::Pos(-1, 1, 0)); + geom->getVertices().push(Corona::Pos(1, 1, 0)); + geom->getVertices().push(Corona::Pos(-1, -1, 0)); + geom->getVertices().push(Corona::Pos(1, -1, 0)); + + + geom->getNormals().push(Corona::Dir(0, 0, -1)); + geom->getNormals().push(Corona::Dir(0, 0, -1)); + geom->getNormals().push(Corona::Dir(0, 0, -1)); + geom->getNormals().push(Corona::Dir(0, 0, -1)); + + geom->getMapCoords().push(Corona::Pos(0, 0, 0)); + geom->getMapCoordIndices().push(0); + geom->getMapCoords().push(Corona::Pos(1, 0, 0)); + geom->getMapCoordIndices().push(1); + geom->getMapCoords().push(Corona::Pos(1, 1, 0)); + geom->getMapCoordIndices().push(2); + geom->getMapCoords().push(Corona::Pos(0, 1, 0)); + geom->getMapCoordIndices().push(3); + + Corona::TriangleData tri; + tri.v[0][0] = 0; + tri.v[0][1] = 1; + tri.v[0][2] = 2; + tri.n[0][0] = 0; + tri.n[0][1] = 1; + tri.n[0][2] = 2; + tri.t[0] = 0; + tri.t[1] = 1; + tri.t[2] = 2; + tri.materialId = 0; + tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; + geom->addPrimitive(tri); + tri.v[0][0] = 2; + tri.v[0][1] = 1; + tri.v[0][2] = 3; + tri.n[0][0] = 2; + tri.n[0][1] = 1; + tri.n[0][2] = 3; + tri.t[0] = 2; + tri.t[1] = 1; + tri.t[2] = 3; + tri.materialId = 0; + tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; + geom->addPrimitive(tri); +} + Corona::IGeometryGroup* CoronaRenderer::defineStdPlane() { Corona::IGeometryGroup* geom = this->context.scene->addGeomGroup(); @@ -83,6 +134,168 @@ void CoronaRenderer::updateMesh(std::shared_ptr obj) obj->addMeshData(); } +void defineMesh(Corona::IGeometryGroup *group, const MObject& meshObject) +{ + MStatus stat = MStatus::kSuccess; + bool hasDisplacement = false; + Corona::SharedPtr displacementMap = nullptr; + float displacementMin = 0.0f; + float displacementMax = 0.01f; + + MFnMesh meshFn(meshObject, &stat); + CHECK_MSTATUS(stat); + + MPointArray points; + MFloatVectorArray normals; + MFloatArray uArray, vArray; + MIntArray triPointIds, triNormalIds, triUvIds, triMatIds, perFaceAssignments; + MObject mo = meshObject; + getMeshData(mo, points, normals, uArray, vArray, triPointIds, triNormalIds, triUvIds, triMatIds, perFaceAssignments); + + Logging::debug(MString("Translating mesh object ") + meshFn.name().asChar()); + MString meshFullName = makeGoodString(meshFn.fullPathName()); + + uint numVertices = points.length(); + uint numNormals = normals.length(); + uint numUvs = uArray.length(); + + Corona::TriangleData td; + Corona::IGeometryGroup* geom = group; + + uint npts = 0; + for (uint vtxId = 0; vtxId < numVertices; vtxId++) + { + MPoint& p = points[vtxId]; + geom->getVertices().push(Corona::Pos(p.x, p.y, p.z)); + } + + for (uint nId = 0; nId < numNormals; nId++) + { + MFloatVector& n = normals[nId]; + geom->getNormals().push(Corona::Dir(n.x, n.y, n.z)); + } + + for (uint tId = 0; tId < numUvs; tId++) + { + size_t mcl = geom->getMapCoordIndices().size(); + geom->getMapCoordIndices().push(mcl); + geom->getMapCoords().push(Corona::Pos(uArray[tId], vArray[tId], 0.0f)); + } + + int numTris = triPointIds.length() / 3; + for (uint triId = 0; triId < numTris; triId++) + { + uint index = triId * 3; + int perFaceShadingGroup = triMatIds[triId]; + int vtxId0 = triPointIds[index]; + int vtxId1 = triPointIds[index + 1]; + int vtxId2 = triPointIds[index + 2]; + int normalId0 = triNormalIds[index]; + int normalId1 = triNormalIds[index + 1]; + int normalId2 = triNormalIds[index + 2]; + int uvId0 = triUvIds[index]; + int uvId1 = triUvIds[index + 1]; + int uvId2 = triUvIds[index + 2]; + + std::auto_ptr trip; + + if (hasDisplacement) + { + trip = std::auto_ptr(new Corona::DisplacedTriangleData); + Corona::DisplacedTriangleData *dtri = (Corona::DisplacedTriangleData *)trip.get(); + dtri->displacement.map = displacementMap; + dtri->displacement.waterLevel = -Corona::INFINITY; + dtri->displacement.min = displacementMin; + dtri->displacement.max = displacementMax; + + + //Corona::DisplacedTriangleData tri; + //tri.displacement.map = displacementMap; + //tri.displacement.waterLevel = -Corona::INFINITY; + //MPoint p0 = points[vtxId0]; + //MPoint p1 = points[vtxId1]; + //MPoint p2 = points[vtxId2]; + //tri.v[0] = Corona::AnimatedPos(Corona::Pos(p0.x, p0.y, p0.z)); + //tri.v[1] = Corona::AnimatedPos(Corona::Pos(p1.x, p1.y, p1.z)); + //tri.v[2] = Corona::AnimatedPos(Corona::Pos(p2.x, p2.y, p2.z)); + //MVector n0 = normals[normalId0]; + //MVector n1 = normals[normalId1]; + //MVector n2 = normals[normalId2]; + //Corona::Dir dir0(n0.x, n0.y, n0.z); + //Corona::Dir dir1(n1.x, n1.y, n1.z); + //Corona::Dir dir2(n2.x, n2.y, n2.z); + //tri.n[0] = Corona::AnimatedDir(dir0); + //tri.n[1] = Corona::AnimatedDir(dir1); + //tri.n[2] = Corona::AnimatedDir(dir2); + //Corona::Pos uv0(uArray[uvId0], vArray[uvId0], 0.0); + //Corona::Pos uv1(uArray[uvId1], vArray[uvId1], 0.0); + //Corona::Pos uv2(uArray[uvId2], vArray[uvId2], 0.0); + //Corona::StaticArray uvp; + //if (numUvs > 0) + //{ + // uvp[0] = uv0; + // uvp[1] = uv1; + // uvp[2] = uv2; + // tri.t.push(uvp); + //} + //tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; + //tri.materialId = perFaceShadingGroup; + //tri.displacement.min = displacementMin; + //tri.displacement.max = displacementMax; + //geom->addPrimitive(tri); + } + else{ + trip = std::auto_ptr(new Corona::TriangleData); + //Corona::TriangleData tri; + + //tri.v.setSegments(1 - 1); + //tri.n.setSegments(1 - 1); + + //for (int stepId = 0; stepId < 1; stepId++) + //{ + // tri.v[stepId][0] = vtxId0 + numVertices * stepId; + // tri.v[stepId][1] = vtxId1 + numVertices * stepId; + // tri.v[stepId][2] = vtxId2 + numVertices * stepId; + // tri.n[stepId][0] = normalId0 + numNormals * stepId; + // tri.n[stepId][1] = normalId1 + numNormals * stepId; + // tri.n[stepId][2] = normalId2 + numNormals * stepId; + //} + + //if (numUvs > 0) + //{ + // tri.t[0] = uvId0; + // tri.t[1] = uvId1; + // tri.t[2] = uvId2; + //} + //tri.materialId = perFaceShadingGroup; + //tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; + //geom->addPrimitive(tri); + } + trip->v.setSegments(1 - 1); + trip->n.setSegments(1 - 1); + + for (int stepId = 0; stepId < 1; stepId++) + { + trip->v[stepId][0] = vtxId0 + numVertices * stepId; + trip->v[stepId][1] = vtxId1 + numVertices * stepId; + trip->v[stepId][2] = vtxId2 + numVertices * stepId; + trip->n[stepId][0] = normalId0 + numNormals * stepId; + trip->n[stepId][1] = normalId1 + numNormals * stepId; + trip->n[stepId][2] = normalId2 + numNormals * stepId; + } + + if (numUvs > 0) + { + trip->t[0] = uvId0; + trip->t[1] = uvId1; + trip->t[2] = uvId2; + } + trip->materialId = perFaceShadingGroup; + trip->edgeVis[0] = trip->edgeVis[1] = trip->edgeVis[2] = true; + geom->addPrimitive(*trip); + } +} + void CoronaRenderer::defineMesh(std::shared_ptr mobj) { std::shared_ptr mayaScene = MayaTo::getWorldPtr()->worldScenePtr; @@ -121,7 +334,8 @@ void CoronaRenderer::defineMesh(std::shared_ptr mobj) { Logging::error(MString("File texture extension is not supported: ") + fileTexturePath); }else{ - mtco_MapLoader loader; + MObject nullObj; + mtco_MapLoader loader(nullObj); displacementMap = loader.loadBitmap(fileTexturePath.asChar()); hasDisplacement = true; } @@ -140,105 +354,6 @@ void CoronaRenderer::defineMesh(std::shared_ptr mobj) Logging::debug("defineMesh pre getMeshData"); obj->getMeshData(points, normals, uArray, vArray, triPointIds, triNormalIds, triUvIds, triMatIds); - //std::cout << "const float points[] = {\n"; - //for (uint i = 0; i < points.length(); i++) - //{ - // MString p(""); - // for (uint k = 0; k < 3; k++) - // { - // MString ps = MString("") + points[i][k]; - // if (ps == "0") - // ps = "0.0"; - // if (ps == "1") - // ps = "1.0"; - // if (ps == "-1") - // ps = "-1.0"; - // p = p + ps + "f"; - // if (i < points.length() - 1) - // p = p + ","; - // } - // std::cout << p.asChar() << "\n"; - //} - //std::cout << "}\n"; - //std::cout << "const float normals[] = {\n"; - //for (uint i = 0; i < normals.length(); i++) - //{ - // MString p(""); - // for (uint k = 0; k < 3; k++) - // { - // MString ps = MString("") + normals[i][k]; - // if (ps == "0") - // ps = "0.0"; - // if (ps == "1") - // ps = "1.0"; - // if (ps == "-1") - // ps = "-1.0"; - // p = p + ps + "f"; - // if (i < normals.length() - 1) - // p = p + ","; - // } - // std::cout << p.asChar() << "\n"; - //} - //std::cout << "}\n"; - //std::cout << "const float uv[] = {\n"; - //for (uint i = 0; i < uArray.length(); i++) - //{ - // MString p(""); - // MString us = MString("") + uArray[i]; - // if (us == "0") - // us = "0.0"; - // if (us == "1") - // us = "1.0"; - // if (us == "-1") - // us = "-1.0"; - // MString vs = MString("") + vArray[i]; - // if (vs == "0") - // vs = "0.0"; - // if (vs == "1") - // vs = "1.0"; - // if (vs == "-1") - // vs = "-1.0"; - // p = p + us + "f, " + vs + "f"; - // if (i < uArray.length() - 1) - // p = p + ","; - // std::cout << p.asChar() << "\n"; - //} - //std::cout << "}\n"; - - //std::cout << "const int triPointIds[] = {\n"; - //for (uint i = 0; i < triPointIds.length(); i += 3) - //{ - // MString p; - // p = p + triPointIds[i] + ", " + triPointIds[i + 1] + ", " + triPointIds[i + 2]; - // if (i < triPointIds.length() - 3) - // p = p + ","; - // std::cout << p.asChar() << "\n"; - //} - //std::cout << "};\n"; - - //std::cout << "const int triNormalIds[] = {\n"; - //for (uint i = 0; i < triNormalIds.length(); i += 3) - //{ - // MString p; - // p = p + triNormalIds[i] + ", " + triNormalIds[i + 1] + ", " + triNormalIds[i + 2]; - // if (i < triNormalIds.length() - 3) - // p = p + ","; - // std::cout << p.asChar() << "\n"; - //} - //std::cout << "};\n"; - - //std::cout << "const int triUvIds[] = {\n"; - //for (uint i = 0; i < triUvIds.length(); i += 3) - //{ - // MString p; - // p = p + triUvIds[i] + ", " + triUvIds[i + 1] + ", " + triUvIds[i + 2]; - // if (i < triUvIds.length() - 3) - // p = p + ","; - // std::cout << p.asChar() << "\n"; - //} - //std::cout << "};\n"; - - int numSteps = (int)obj->meshDataList.size(); uint numVertices = points.length(); uint numNormals = normals.length(); @@ -274,20 +389,15 @@ void CoronaRenderer::defineMesh(std::shared_ptr mobj) } } npts = md.points.length(); - //Logging::debug(MString("Adding ") + npts + " points for step " + mbStep); for( uint vtxId = 0; vtxId < md.points.length(); vtxId++) { MPoint& p = md.points[vtxId]; - //Logging::debug(MString("geom->getVertices().push(Corona::Pos(") + p.x + ", " + p.y + ", " + p.z + " ));"); geom->getVertices().push(Corona::Pos(p.x,p.y,p.z)); } - //Logging::debug(MString("Adding ") + md.normals.length() + " normals for step " + mbStep); for (uint nId = 0; nId < md.normals.length(); nId++) { MFloatVector& n = md.normals[nId]; - //Logging::debug(MString("geom->getNormals().push(Corona::Pos(") + n.x + ", " + n.y + ", " + n.z + " ));"); - //Logging::debug(MString("N id: ") + nId + ": " + n.x + " " + n.y + " " + n.z); geom->getNormals().push(Corona::Dir(n.x, n.y, n.z)); } } @@ -296,22 +406,12 @@ void CoronaRenderer::defineMesh(std::shared_ptr mobj) { size_t mcl = geom->getMapCoordIndices().size(); geom->getMapCoordIndices().push(mcl); - //Logging::debug(MString("geom->getMapCoordIndices().push(") + mcl + ");"); geom->getMapCoords().push(Corona::Pos(uArray[tId], vArray[tId], 0.0f)); - //Logging::debug(MString("geom->getMapCoords().push(Corona::Pos(") + uArray[tId] + ", " + vArray[tId] + ", 0.0f));"); - //Logging::debug(MString("Geom - Add Uvs : ") + uArray[tId] + " " + vArray[tId]); } - //geom->getMapCoordIndices().push(geom->getMapCoordIndices().size()); - obj->geom = geom; int numTris = triPointIds.length() / 3; - //context.core->sanityCheck(context.scene); - - //Logging::debug(MString("Corona::TriangleData tri;")); - - //Logging::debug(MString("for (uint triId = 0; triId < ") + numTris + "; triId++)\n{"); for (uint triId = 0; triId < numTris; triId++) { uint index = triId * 3; @@ -328,98 +428,108 @@ void CoronaRenderer::defineMesh(std::shared_ptr mobj) if ((vtxId0 >= npts) || (vtxId1 >= npts) || (vtxId2 >= npts)) Logging::error(MString("Index > npts!!! -- Obj: ") + obj->shortName); - //Logging::debug(MString("VtxIds: ") + vtxId0 + " " + vtxId1 + " " + vtxId2); - //Logging::debug(MString("NorIds: ") + normalId0 + " " + normalId1 + " " + normalId2); - //Logging::debug(MString("UVsIds: ") + uvId0 + " " + uvId1 + " " + uvId2); - //Logging::debug(MString("") + points[vtxId0].x + " " + points[vtxId0].y + " " + points[vtxId0].z); - //Logging::debug(MString("") + points[vtxId1].x + " " + points[vtxId1].y + " " + points[vtxId1].z); - //Logging::debug(MString("") + points[vtxId2].x + " " + points[vtxId2].y + " " + points[vtxId2].z); - //Logging::debug(MString("") + normals[normalId0].x + " " + normals[normalId0].y + " " + normals[normalId0].z); - //Logging::debug(MString("") + normals[normalId1].x + " " + normals[normalId1].y + " " + normals[normalId1].z); - //Logging::debug(MString("") + normals[normalId2].x + " " + normals[normalId2].y + " " + normals[normalId2].z); - - //Logging::debug(MString("") + uArray[uvId0] + " " + vArray[uvId0]); - //Logging::debug(MString("") + uArray[uvId1] + " " + vArray[uvId1]); - //Logging::debug(MString("") + uArray[uvId2] + " " + vArray[uvId2]); + std::auto_ptr trip; if (hasDisplacement) { - Corona::DisplacedTriangleData tri; - tri.displacement.map = displacementMap; - tri.displacement.waterLevel = -Corona::INFINITY; - MPoint p0 = points[vtxId0]; - MPoint p1 = points[vtxId1]; - MPoint p2 = points[vtxId2]; - tri.v[0] = Corona::AnimatedPos(Corona::Pos(p0.x, p0.y, p0.z)); - tri.v[1] = Corona::AnimatedPos(Corona::Pos(p1.x, p1.y, p1.z)); - tri.v[2] = Corona::AnimatedPos(Corona::Pos(p2.x, p2.y, p2.z)); - MVector n0 = normals[normalId0]; - MVector n1 = normals[normalId1]; - MVector n2 = normals[normalId2]; - Corona::Dir dir0(n0.x, n0.y, n0.z); - Corona::Dir dir1(n1.x, n1.y, n1.z); - Corona::Dir dir2(n2.x, n2.y, n2.z); - tri.n[0] = Corona::AnimatedDir(dir0); - tri.n[1] = Corona::AnimatedDir(dir1); - tri.n[2] = Corona::AnimatedDir(dir2); - Corona::Pos uv0(uArray[uvId0],vArray[uvId0],0.0); - Corona::Pos uv1(uArray[uvId1],vArray[uvId1],0.0); - Corona::Pos uv2(uArray[uvId2],vArray[uvId2],0.0); - Corona::StaticArray uvp; - if (numUvs > 0) - { - uvp[0] = uv0; - uvp[1] = uv1; - uvp[2] = uv2; - tri.t.push(uvp); - } - tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; - tri.materialId = perFaceShadingGroup; - tri.displacement.min = displacementMin; - tri.displacement.max = displacementMax; - geom->addPrimitive(tri); + trip = std::auto_ptr(new Corona::DisplacedTriangleData); + Corona::DisplacedTriangleData *dtri = (Corona::DisplacedTriangleData *)trip.get(); + dtri->displacement.map = displacementMap; + dtri->displacement.waterLevel = -Corona::INFINITY; + dtri->displacement.min = displacementMin; + dtri->displacement.max = displacementMax; } else{ - Corona::TriangleData tri; + trip = std::auto_ptr(new Corona::TriangleData); + } - tri.v.setSegments(numSteps - 1); - tri.n.setSegments(numSteps - 1); + trip->v.setSegments(1 - 1); + trip->n.setSegments(1 - 1); - for (int stepId = 0; stepId < numSteps; stepId++) - { - tri.v[stepId][0] = vtxId0 + numVertices * stepId; - tri.v[stepId][1] = vtxId1 + numVertices * stepId; - tri.v[stepId][2] = vtxId2 + numVertices * stepId; - //Logging::debug(MString("TriId ") + triId + " vtx: " + vtxId0 + " " + vtxId1 + " " + vtxId2); - tri.n[stepId][0] = normalId0 + numNormals * stepId; - tri.n[stepId][1] = normalId1 + numNormals * stepId; - tri.n[stepId][2] = normalId2 + numNormals * stepId; - //Logging::debug(MString("tri.v[") + stepId + "][0] = " + (vtxId0 + numVertices * stepId) + ";"); - //Logging::debug(MString("tri.v[") + stepId + "][1] = " + (vtxId1 + numVertices * stepId) + ";"); - //Logging::debug(MString("tri.v[") + stepId + "][2] = " + (vtxId2 + numVertices * stepId) + ";"); - //Logging::debug(MString("tri.n[") + stepId + "][0] = " + (normalId0 + numNormals * stepId) + ";"); - //Logging::debug(MString("tri.n[") + stepId + "][1] = " + (normalId1 + numNormals * stepId) + ";"); - //Logging::debug(MString("tri.n[") + stepId + "][2] = " + (normalId2 + numNormals * stepId) + ";"); - } + for (int stepId = 0; stepId < 1; stepId++) + { + trip->v[stepId][0] = vtxId0 + numVertices * stepId; + trip->v[stepId][1] = vtxId1 + numVertices * stepId; + trip->v[stepId][2] = vtxId2 + numVertices * stepId; + trip->n[stepId][0] = normalId0 + numNormals * stepId; + trip->n[stepId][1] = normalId1 + numNormals * stepId; + trip->n[stepId][2] = normalId2 + numNormals * stepId; + } - if (numUvs > 0) - { - tri.t[0] = uvId0; - tri.t[1] = uvId1; - tri.t[2] = uvId2; - //Logging::debug(MString("tri.t[0] = ") + uvId0 + ";"); - //Logging::debug(MString("tri.t[1] = ") + uvId1 + ";"); - //Logging::debug(MString("tri.t[2] = ") + uvId2 + ";"); - } - //Logging::debug(MString("tri.materialId = ") + perFaceShadingGroup + ";"); - tri.materialId = perFaceShadingGroup; - //Logging::debug(MString("tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true;")); - tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; - //Logging::debug(MString("geom->addPrimitive(tri);")); - geom->addPrimitive(tri); - //context.core->sanityCheck(context.scene); + if (numUvs > 0) + { + trip->t[0] = uvId0; + trip->t[1] = uvId1; + trip->t[2] = uvId2; } + trip->materialId = perFaceShadingGroup; + trip->edgeVis[0] = trip->edgeVis[1] = trip->edgeVis[2] = true; + geom->addPrimitive(*trip); + + //if (hasDisplacement) + //{ + // Corona::DisplacedTriangleData tri; + // tri.displacement.map = displacementMap; + // tri.displacement.waterLevel = -Corona::INFINITY; + // MPoint p0 = points[vtxId0]; + // MPoint p1 = points[vtxId1]; + // MPoint p2 = points[vtxId2]; + // tri.v[0] = Corona::AnimatedPos(Corona::Pos(p0.x, p0.y, p0.z)); + // tri.v[1] = Corona::AnimatedPos(Corona::Pos(p1.x, p1.y, p1.z)); + // tri.v[2] = Corona::AnimatedPos(Corona::Pos(p2.x, p2.y, p2.z)); + // MVector n0 = normals[normalId0]; + // MVector n1 = normals[normalId1]; + // MVector n2 = normals[normalId2]; + // Corona::Dir dir0(n0.x, n0.y, n0.z); + // Corona::Dir dir1(n1.x, n1.y, n1.z); + // Corona::Dir dir2(n2.x, n2.y, n2.z); + // tri.n[0] = Corona::AnimatedDir(dir0); + // tri.n[1] = Corona::AnimatedDir(dir1); + // tri.n[2] = Corona::AnimatedDir(dir2); + // Corona::Pos uv0(uArray[uvId0],vArray[uvId0],0.0); + // Corona::Pos uv1(uArray[uvId1],vArray[uvId1],0.0); + // Corona::Pos uv2(uArray[uvId2],vArray[uvId2],0.0); + // Corona::StaticArray uvp; + // if (numUvs > 0) + // { + // uvp[0] = uv0; + // uvp[1] = uv1; + // uvp[2] = uv2; + // tri.t.push(uvp); + // } + // tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; + // tri.materialId = perFaceShadingGroup; + // tri.displacement.min = displacementMin; + // tri.displacement.max = displacementMax; + // geom->addPrimitive(tri); + //} + //else{ + // Corona::TriangleData tri; + + // tri.v.setSegments(numSteps - 1); + // tri.n.setSegments(numSteps - 1); + + // for (int stepId = 0; stepId < numSteps; stepId++) + // { + // tri.v[stepId][0] = vtxId0 + numVertices * stepId; + // tri.v[stepId][1] = vtxId1 + numVertices * stepId; + // tri.v[stepId][2] = vtxId2 + numVertices * stepId; + // tri.n[stepId][0] = normalId0 + numNormals * stepId; + // tri.n[stepId][1] = normalId1 + numNormals * stepId; + // tri.n[stepId][2] = normalId2 + numNormals * stepId; + // } + + // if (numUvs > 0) + // { + // tri.t[0] = uvId0; + // tri.t[1] = uvId1; + // tri.t[2] = uvId2; + // } + // tri.materialId = perFaceShadingGroup; + // tri.edgeVis[0] = tri.edgeVis[1] = tri.edgeVis[2] = true; + // geom->addPrimitive(tri); + //} } //Logging::debug("}"); obj->perFaceAssignments.clear(); @@ -476,7 +586,7 @@ void CoronaRenderer::defineGeometry() Corona::AnimatedAffineTm atm; this->setAnimatedTransformationMatrix(atm, obj); obj->instance = geom->addInstance(atm, obj.get(), nullptr); - + MFnDependencyNode depFn(obj->mobject); if (getBoolAttr("mtco_envPortal", depFn, false)) { diff --git a/src/mayaToCorona/src/Corona/CoronaGeometry.h b/src/mayaToCorona/src/Corona/CoronaGeometry.h new file mode 100644 index 0000000..5aaf59b --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaGeometry.h @@ -0,0 +1,9 @@ +#ifndef CORONA_GEO_H +#define CORONA_GEO_H + +#include "CoronaCore/api/Api.h" + +void defineStdPlane(Corona::IGeometryGroup *group); +void defineMesh(Corona::IGeometryGroup *group, const MObject& geoObj); + +#endif \ No newline at end of file diff --git a/src/mayaToCorona/src/Corona/CoronaLights.cpp b/src/mayaToCorona/src/Corona/CoronaLights.cpp index b061a50..ffa95b0 100644 --- a/src/mayaToCorona/src/Corona/CoronaLights.cpp +++ b/src/mayaToCorona/src/Corona/CoronaLights.cpp @@ -13,8 +13,6 @@ #include "world.h" #include "../mtco_common/mtco_mayaObject.h" -static Logging logger; - bool CoronaRenderer::isSunLight(std::shared_ptr obj) { // a sun light has a transform connection to the coronaGlobals.sunLightConnection plug @@ -51,63 +49,65 @@ void CoronaRenderer::defineLights() Corona::Rgb bgRgb = toCorona(getColorAttr("bgColor", depFn)); int bgType = getEnumInt("bgType", depFn); - if( renderGlobals->useSunLightConnection) - { - getConnectedInNodes(MString("sunLightConnection"), coronaGlobals, nodeList); - if( nodeList.length() > 0) - { - MObject sunObj = nodeList[0]; - if(sunObj.hasFn(MFn::kTransform)) - { - // we suppose what's connected here is a dir light transform - MVector lightDir(0, 0, 1); // default dir light dir - MFnDagNode sunDagNode(sunObj); - lightDir *= sunDagNode.transformationMatrix(); - lightDir *= renderGlobals->globalConversionMatrix; - lightDir.normalize(); - - MObject sunDagObj = sunDagNode.child(0, &stat); - MColor sunColor(1); - float colorMultiplier = 1.0f; - if(sunDagObj.hasFn(MFn::kDirectionalLight)) - { - MFnDependencyNode sunNode(sunDagObj); - getColor("color", sunNode, sunColor); - colorMultiplier = getFloatAttr("mtco_sun_multiplier", sunNode, 1.0f); - }else{ - Logging::warning(MString("Sun connection is not a directional light - using transform only.")); - } - const float intensityFactor = (1.f - cos(Corona::SUN_PROJECTED_HALF_ANGLE)) / (1.f - cos(getFloatAttr("sunSizeMulti", rGlNode, 1.0f) * Corona::SUN_PROJECTED_HALF_ANGLE)); - sunColor *= colorMultiplier * intensityFactor * 1.0;// 2000000; - Corona::Sun sun; + //if( renderGlobals->useSunLightConnection) + //{ + // getConnectedInNodes(MString("sunLightConnection"), coronaGlobals, nodeList); + // if( nodeList.length() > 0) + // { + // MObject sunObj = nodeList[0]; + // if(sunObj.hasFn(MFn::kTransform)) + // { + // // we suppose what's connected here is a dir light transform + // MVector lightDir(0, 0, 1); // default dir light dir + // MFnDagNode sunDagNode(sunObj); + // lightDir *= sunDagNode.transformationMatrix(); + // lightDir *= renderGlobals->globalConversionMatrix; + // lightDir.normalize(); + // + // MObject sunDagObj = sunDagNode.child(0, &stat); + // MColor sunColor(1); + // float colorMultiplier = 1.0f; + // if(sunDagObj.hasFn(MFn::kDirectionalLight)) + // { + // MFnDependencyNode sunNode(sunDagObj); + // getColor("color", sunNode, sunColor); + // colorMultiplier = getFloatAttr("mtco_sun_multiplier", sunNode, 1.0f); + // }else{ + // Logging::warning(MString("Sun connection is not a directional light - using transform only.")); + // } + // const float intensityFactor = (1.f - cos(Corona::SUN_PROJECTED_HALF_ANGLE)) / (1.f - cos(getFloatAttr("sunSizeMulti", rGlNode, 1.0f) * Corona::SUN_PROJECTED_HALF_ANGLE)); + // sunColor *= colorMultiplier * intensityFactor * 1.0;// 2000000; + // Corona::Sun sun; - Corona::ColorOrMap bgCoMap = this->context.scene->getBackground(); - SkyMap *sky = dynamic_cast(bgCoMap.getMap()); - Corona::Rgb avgColor(1, 1, 1); - if (sky != nullptr) - { - avgColor = sky->sc(); - } + // Corona::ColorOrMap bgCoMap = this->context.scene->getBackground(); + // SkyMap *sky = dynamic_cast(bgCoMap.getMap()); + // Corona::Rgb avgColor(1, 1, 1); + // if (sky != nullptr) + // { + // avgColor = sky->sc(); + // } - Corona::Rgb sColor(sunColor.r, sunColor.g, sunColor.b); - sun.color = sColor * avgColor; - sun.active = true; - sun.dirTo = Corona::Dir(lightDir.x, lightDir.y, lightDir.z).getNormalized(); - //sun.color = Corona::Rgb(sunColor.r,sunColor.g,sunColor.b); - sun.visibleDirect = true; - sun.visibleReflect = true; - sun.visibleRefract = true; - sun.sizeMultiplier = getFloatAttr("sunSizeMulti", rGlNode, 1.0); - this->context.scene->getSun() = sun; - sky->initSky(); - if (sky != nullptr) - { - avgColor = sky->sc(); - this->context.scene->getSun().color = sColor * avgColor; - } - } - } - } + // Corona::Rgb sColor(sunColor.r, sunColor.g, sunColor.b); + // sun.color = sColor * avgColor; + // sun.active = true; + // sun.dirTo = Corona::Dir(lightDir.x, lightDir.y, lightDir.z).getNormalized(); + // //sun.color = Corona::Rgb(sunColor.r,sunColor.g,sunColor.b); + // sun.visibleDirect = true; + // sun.visibleReflect = true; + // sun.visibleRefract = true; + // sun.sizeMultiplier = getFloatAttr("sunSizeMulti", rGlNode, 1.0); + // this->context.scene->getSun() = sun; + // sky->initSky(); + // if (sky != nullptr) + // { + // avgColor = sky->sc(); + // this->context.scene->getSun().color = sColor * avgColor; + // } + // } + // } + //} + + MayaObject *sunLight = nullptr; for (auto mobj : mayaScene->lightList) { @@ -116,8 +116,6 @@ void CoronaRenderer::defineLights() if(!obj->visible) continue; - if( this->isSunLight(obj)) - continue; MFnDependencyNode depFn(obj->mobject); @@ -180,43 +178,92 @@ void CoronaRenderer::defineLights() Corona::AffineTm tm; setTransformationMatrix(sl->lightWorldInverseMatrix, m); ShadingNetwork network(obj->mobject); - sl->lightColorMap = defineAttribute(MString("color"), depFn, network); + sl->lightColorMap = defineAttribute(MString("color"), depFn, network, oslRenderer); this->context.scene->addLightShader(sl); } if( obj->mobject.hasFn(MFn::kDirectionalLight)) { - MVector lightDir(0, 0, -1); - MVector lightDirTangent(1, 0, 0); - MVector lightDirBiTangent(0, 1, 0); - MColor col; - getColor("color", depFn, col); - float intensity = 1.0f; - getFloat("intensity", depFn, intensity); - MMatrix m = obj->transformMatrices[0] * renderGlobals->globalConversionMatrix; - lightDir *= m; - lightDirTangent *= m; - lightDirBiTangent *= m; - lightDir.normalize(); - - Corona::Pos LP(m[3][0],m[3][1],m[3][2]); - DirectionalLight *dl = new DirectionalLight; - dl->LP = LP; - dl->lightColor = Corona::Rgb(col.r, col.g, col.b); - dl->lightIntensity = intensity; - dl->LD = Corona::Dir(lightDir.x, lightDir.y, lightDir.z); - dl->LT = Corona::Dir(lightDirTangent.x, lightDirTangent.y, lightDirTangent.z); - dl->LBT = Corona::Dir(lightDirBiTangent.x, lightDirBiTangent.y, lightDirBiTangent.z); - dl->lightAngle = getFloatAttr("lightAngle", depFn, 0.0); - dl->doShadows = getBoolAttr("useRayTraceShadows", depFn, true); - col = getColorAttr("shadowColor", depFn); - dl->shadowColor = Corona::Rgb(col.r, col.g, col.b); - for (auto excludedObj : obj->excludedObjects) + if (getBoolAttr("mtco_useAsSun", depFn, false)) { - dl->excludeList.nodes.push(excludedObj.get()); + if (sunLight != nullptr) + { + Logging::error(MString("A sun light is already defined, ignoring ") + obj->shortName); + continue; + } + sunLight = obj.get(); + MVector lightDir(0, 0, 1); // default dir light dir + lightDir *= obj->transformMatrices[0]; + lightDir *= renderGlobals->globalConversionMatrix; + lightDir.normalize(); + + MColor sunColor(1); + MFnDependencyNode sunNode(obj->mobject); + getColor("color", sunNode, sunColor); + sunColor *= getFloatAttr("intensity", sunNode, 1.0f); + //float colorMultiplier colorMultiplier = getFloatAttr("mtco_sun_multiplier", sunNode, 1.0f); + const float intensityFactor = (1.f - cos(Corona::SUN_PROJECTED_HALF_ANGLE)) / (1.f - cos(getFloatAttr("sunSizeMulti", rGlNode, 1.0f) * Corona::SUN_PROJECTED_HALF_ANGLE)); + sunColor *= intensityFactor * 1.0;// 2000000; + Corona::Sun sun; + + Corona::ColorOrMap bgCoMap = this->context.scene->getBackground(); + SkyMap *sky = dynamic_cast(bgCoMap.getMap()); + Corona::Rgb avgColor(1, 1, 1); + if (sky != nullptr) + { + avgColor = sky->sc(); + } + + Corona::Rgb sColor(sunColor.r, sunColor.g, sunColor.b); + sun.color = sColor * avgColor; + sun.active = true; + sun.dirTo = Corona::Dir(lightDir.x, lightDir.y, lightDir.z).getNormalized(); + //sun.color = Corona::Rgb(sunColor.r,sunColor.g,sunColor.b); + sun.visibleDirect = true; + sun.visibleReflect = true; + sun.visibleRefract = true; + sun.sizeMultiplier = getFloatAttr("sunSizeMulti", rGlNode, 1.0); + this->context.scene->getSun() = sun; + sky->initSky(); + if (sky != nullptr) + { + avgColor = sky->sc(); + this->context.scene->getSun().color = sColor * avgColor; + } } + else{ + MVector lightDir(0, 0, -1); + MVector lightDirTangent(1, 0, 0); + MVector lightDirBiTangent(0, 1, 0); + MColor col; + getColor("color", depFn, col); + float intensity = 1.0f; + getFloat("intensity", depFn, intensity); + MMatrix m = obj->transformMatrices[0] * renderGlobals->globalConversionMatrix; + lightDir *= m; + lightDirTangent *= m; + lightDirBiTangent *= m; + lightDir.normalize(); - this->context.scene->addLightShader(dl); + Corona::Pos LP(m[3][0], m[3][1], m[3][2]); + DirectionalLight *dl = new DirectionalLight; + dl->LP = LP; + dl->lightColor = Corona::Rgb(col.r, col.g, col.b); + dl->lightIntensity = intensity; + dl->LD = Corona::Dir(lightDir.x, lightDir.y, lightDir.z); + dl->LT = Corona::Dir(lightDirTangent.x, lightDirTangent.y, lightDirTangent.z); + dl->LBT = Corona::Dir(lightDirBiTangent.x, lightDirBiTangent.y, lightDirBiTangent.z); + dl->lightAngle = getFloatAttr("lightAngle", depFn, 0.0); + dl->doShadows = getBoolAttr("useRayTraceShadows", depFn, true); + col = getColorAttr("shadowColor", depFn); + dl->shadowColor = Corona::Rgb(col.r, col.g, col.b); + for (auto excludedObj : obj->excludedObjects) + { + dl->excludeList.nodes.push(excludedObj.get()); + } + + this->context.scene->addLightShader(dl); + } } if( obj->mobject.hasFn(MFn::kAreaLight)) { @@ -237,7 +284,7 @@ void CoronaRenderer::defineLights() MColor lightColor = getColorAttr("color", depFn); float intensity = getFloatAttr("intensity", depFn, 1.0f); lightColor *= intensity; - Corona::ColorOrMap com = defineAttribute(MString("color"), obj->mobject); + Corona::ColorOrMap com = defineAttribute(MString("color"), obj->mobject, oslRenderer); OSLMap *oslmap = (OSLMap *)com.getMap(); if (oslmap != nullptr) { diff --git a/src/mayaToCorona/src/Corona/CoronaMap.cpp b/src/mayaToCorona/src/Corona/CoronaMap.cpp index fd602af..7f4e3d5 100644 --- a/src/mayaToCorona/src/Corona/CoronaMap.cpp +++ b/src/mayaToCorona/src/Corona/CoronaMap.cpp @@ -1,5 +1,8 @@ #include "CoronaMap.h" +#include #include "utilities/pystring.h" +#include "utilities/attrTools.h" +#include "utilities/tools.h" #include bool textureFileSupported(MString fileName) @@ -19,4 +22,42 @@ bool textureFileSupported(MString fileName) return true; return false; -} \ No newline at end of file +} + + +mtco_MapLoader::mtco_MapLoader(MObject& mobject) +{ + if (mobject == MObject::kNullObj) + return; + MFnDependencyNode depFn(mobject); + colorGain = getColorAttr("colorGain", depFn); + colorOffset = getColorAttr("colorOffset", depFn); + exposure = getFloatAttr("exposure", depFn, 0.0f); + MObject place2dNode = getConnectedInNode(mobject, "uvCoord"); + if ((place2dNode != MObject::kNullObj) && (place2dNode.hasFn(MFn::kPlace2dTexture))) + { + MFnDependencyNode placeFn(place2dNode); + float coverageU = getFloatAttr("coverageU", placeFn, 1.0f); + float coverageV = getFloatAttr("coverageV", placeFn, 1.0f); + float translateFrameU = getFloatAttr("translateFrameU", placeFn, 0.0f); + float translateFrameV = getFloatAttr("translateFrameV", placeFn, 0.0f); + float rotateFrame = getFloatAttr("rotateFrame", placeFn, 0.0f); + float repeatU = getFloatAttr("repeatU", placeFn, 1.0f); + float repeatV = getFloatAttr("repeatV", placeFn, 1.0f); + float offsetU = getFloatAttr("offsetU", placeFn, 0.0f); + float offsetV = getFloatAttr("offsetV", placeFn, 0.0f); + float rotateUV = getFloatAttr("rotateUV", placeFn, 0.0f); + float noiseU = getFloatAttr("noiseU", placeFn, 1.0f); + float noiseV = getFloatAttr("noiseV", placeFn, 1.0f); + float mirrorU = getBoolAttr("mirrorU", placeFn, false); + float mirrorV = getBoolAttr("mirrorV", placeFn, false); + float wrapU = getBoolAttr("wrapU", placeFn, true); + float wrapV = getBoolAttr("wrapV", placeFn, true); + float stagger = getBoolAttr("stagger", placeFn, false); + Corona::TextureShader::Config tsConfig; + + } +} + +mtco_MapLoader::~mtco_MapLoader() +{} diff --git a/src/mayaToCorona/src/Corona/CoronaMap.h b/src/mayaToCorona/src/Corona/CoronaMap.h index 946fb80..b5d49ae 100644 --- a/src/mayaToCorona/src/Corona/CoronaMap.h +++ b/src/mayaToCorona/src/Corona/CoronaMap.h @@ -42,75 +42,185 @@ class SidedMap : public Corona::Abstract::Map { static int c = 0; + class mtco_MapLoader : public Corona::Object { public: MColor colorGain; MColor colorOffset; float exposure; - Corona::Abstract::Map* loadBitmap(const Corona::String& filename) { + mtco_MapLoader::mtco_MapLoader(MObject& mobject); + mtco_MapLoader::~mtco_MapLoader(); + Corona::Abstract::Map* loadBitmap(const Corona::String& filename) + { class TextureMap : public Corona::Abstract::Map { protected: Corona::TextureShader shader; public: - MColor colorGain; - MColor colorOffset; - float exposure; + TextureMap(const Corona::String& filename, const int mapChannel) { + Corona::TextureShader::Config config; + config.mapping.uvwMapChannel = mapChannel; + config.texture = Corona::TextureShader::getImageTexture(filename); + + this->shader.configure(config); + } + + virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) { + outAlpha = 1.f; + bool outsideDummy; + return shader.eval(context, true, outsideDummy); + } + + virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) { + outAlpha = 1.f; + + bool outsideDummy; + return shader.eval(context, true, outsideDummy).grayValue(); + } + + virtual Corona::Dir evalBump(const Corona::IShadeContext& context, Corona::TextureCache* cache) { + STOP; + } + + virtual void renderTo(Corona::Bitmap& output) { + //shader.renderTo(output); + } + + + virtual Corona::String name() const { + return "TextureMap"; + } + virtual void getChildren(Corona::Stack&) {} + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { return true; } + + }; + + return new TextureMap(filename, 0); + } +}; + +class mtco_FileLoader : public Corona::Object { +public: + Corona::Abstract::Map* loadBitmap(const Corona::String& filename) + { + class TextureMap : public Corona::Abstract::Map { + protected: + Corona::TextureShader shader; + public: TextureMap(const Corona::String& filename, const int mapChannel) { Corona::TextureShader::Config config; config.mapping.uvwMapChannel = mapChannel; config.texture = Corona::TextureShader::getImageTexture(filename); + this->shader.configure(config); } virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) { outAlpha = 1.f; bool outsideDummy; - float ex = exposure; - Corona::Rgb envColor = shader.eval(context, true, outsideDummy); - //if (c < 100) - //{ - // std::cout << "evalEnvCol " << envColor.r() << " " << envColor.g() << " " << envColor.g() << "\n"; - // c++; - //} - return envColor; + return shader.eval(context, true, outsideDummy); } - /// \brief Same as evalColor, only scalar value is returned virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) { outAlpha = 1.f; + bool outsideDummy; return shader.eval(context, true, outsideDummy).grayValue(); } - /// \brief Evaluates bump mapping for this texture and returns a vector that have to be added to the - /// current normal to create the bump effect (the normal perturbation) virtual Corona::Dir evalBump(const Corona::IShadeContext& context, Corona::TextureCache* cache) { STOP; } - /// \brief Renders the map to given output bitmap. Sets the output dimensions to adequate values. virtual void renderTo(Corona::Bitmap& output) { - shader.renderTo(output); + //shader.renderTo(output); } + virtual Corona::String name() const { return "TextureMap"; } virtual void getChildren(Corona::Stack&) {} + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { return true; } + }; - TextureMap *texMap = new TextureMap(filename, 0); - texMap->colorGain = colorGain; - texMap->colorOffset = colorOffset; - texMap->exposure = exposure; - return texMap; + return new TextureMap(filename, 0); } }; +//class mtco_MapLoader : public Corona::Object { +//public: +// MColor colorGain; +// MColor colorOffset; +// float exposure; +// +// Corona::Abstract::Map* loadBitmap(const Corona::String& filename) { +// +// class TextureMap : public Corona::Abstract::Map { +// protected: +// Corona::TextureShader shader; +// public: +// MColor colorGain; +// MColor colorOffset; +// float exposure; +// +// TextureMap(const Corona::String& filename, const int mapChannel) { +// Corona::TextureShader::Config config; +// config.mapping.uvwMapChannel = mapChannel; +// config.texture = Corona::TextureShader::getImageTexture(filename); +// this->shader.configure(config); +// } +// +// virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) { +// outAlpha = 1.f; +// bool outsideDummy; +// float ex = exposure; +// Corona::Rgb envColor = shader.eval(context, true, outsideDummy); +// //if (c < 100) +// //{ +// // std::cout << "evalEnvCol " << envColor.r() << " " << envColor.g() << " " << envColor.g() << "\n"; +// // c++; +// //} +// return envColor; +// } +// +// /// \brief Same as evalColor, only scalar value is returned +// virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) { +// outAlpha = 1.f; +// bool outsideDummy; +// return shader.eval(context, true, outsideDummy).grayValue(); +// } +// +// /// \brief Evaluates bump mapping for this texture and returns a vector that have to be added to the +// /// current normal to create the bump effect (the normal perturbation) +// virtual Corona::Dir evalBump(const Corona::IShadeContext& context, Corona::TextureCache* cache) { +// STOP; +// } +// +// /// \brief Renders the map to given output bitmap. Sets the output dimensions to adequate values. +// virtual void renderTo(Corona::Bitmap& output) { +// shader.renderTo(output); +// } +// +// virtual Corona::String name() const { +// return "TextureMap"; +// } +// virtual void getChildren(Corona::Stack&) {} +// +// }; +// +// TextureMap *texMap = new TextureMap(filename, 0); +// texMap->colorGain = colorGain; +// texMap->colorOffset = colorOffset; +// texMap->exposure = exposure; +// return texMap; +// } +//}; + // Utility class for loading bitmap textures from files. In future, various procedural textures should be also // loaded using this class. //class MapLoader : public Corona::Object { diff --git a/src/mayaToCorona/src/Corona/CoronaOSLMap.cpp b/src/mayaToCorona/src/Corona/CoronaOSLMap.cpp index e6db8ee..88b3171 100644 --- a/src/mayaToCorona/src/Corona/CoronaOSLMap.cpp +++ b/src/mayaToCorona/src/Corona/CoronaOSLMap.cpp @@ -15,7 +15,6 @@ OSLMap::OSLMap() void OSLMap::setShadingGlobals(const Corona::IShadeContext& context, OSL::ShaderGlobals &sg, int x, int y, OSL::Matrix44& Mshad, OSL::Matrix44& Mobj) { - //this->oslRenderer->renderer.setup_transformations(Mshad, Mobj); // Just zero the whole thing out to start memset(&sg, 0, sizeof(OSL::ShaderGlobals)); @@ -302,8 +301,10 @@ void OSLMap::renderTo(Corona::Bitmap& output) STOP; //currently not supported } -OSLMap::~OSLMap() +bool OSLMap::exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { - Logging::debug(MString("OSLMap resetting shader group")); - this->shaderGroup.reset(); + return true; } + +OSLMap::~OSLMap() +{} diff --git a/src/mayaToCorona/src/Corona/CoronaOSLMap.h b/src/mayaToCorona/src/Corona/CoronaOSLMap.h index 58c7b8b..8c07cf5 100644 --- a/src/mayaToCorona/src/Corona/CoronaOSLMap.h +++ b/src/mayaToCorona/src/Corona/CoronaOSLMap.h @@ -7,7 +7,6 @@ class CoronaRenderer; class OSLMap : public Corona::Abstract::Map { public: - //CoronaRenderer *coronaRenderer; OSL::OSLShadingNetworkRenderer *oslRenderer; enum BumpType { NONE = 0, BUMP, NORMALOBJECT, NORMALTANGENT, NORMALWORLD, BUMP3D}; BumpType bumpType; @@ -16,6 +15,7 @@ class OSLMap : public Corona::Abstract::Map bool isEnvMap; bool isLightMap; float multiplier; + Corona::String mapName = "OSLMap"; OSL::ShaderGroupRef shaderGroup; OSLMap(); ~OSLMap(); @@ -27,4 +27,6 @@ class OSLMap : public Corona::Abstract::Map virtual Corona::Rgb evalColorBump(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha, float u, float v); virtual void renderTo(Corona::Bitmap& output); virtual void getChildren(Corona::Stack&) {} + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const; + virtual Corona::String name() const { return mapName; }; }; diff --git a/src/mayaToCorona/src/Corona/CoronaRoundCorners.cpp b/src/mayaToCorona/src/Corona/CoronaRoundCorners.cpp new file mode 100644 index 0000000..d3d96ce --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaRoundCorners.cpp @@ -0,0 +1,33 @@ +#include "Corona.h" +#include "CoronaRoundCorners.h" +#include +#include "utilities/attrTools.h" + +RoundCorners::RoundCorners(MObject shaderObject) +{ + MFnDependencyNode depFn(shaderObject); +}; + +RoundCorners::~RoundCorners(){}; + +Corona::Rgb RoundCorners::evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) +{ + outAlpha = 1.0f; + float f = 1.0f; + return Corona::Rgb(f, f, f); +} + +float RoundCorners::evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) +{ + return evalColor(context, cache, outAlpha).grayValue(); +} + +Corona::Dir RoundCorners::evalBump(const Corona::IShadeContext&, Corona::TextureCache*) +{ + STOP; //currently not supported +} + +void RoundCorners::renderTo(Corona::Bitmap& output) +{ + STOP; //currently not supported +} diff --git a/src/mayaToCorona/src/Corona/CoronaRoundCorners.h b/src/mayaToCorona/src/Corona/CoronaRoundCorners.h new file mode 100644 index 0000000..9f45271 --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaRoundCorners.h @@ -0,0 +1,32 @@ +#ifndef CORONA_ROUNDCORNERS_MAP +#define CORONA_ROUNDCORNERS_MAP + +#include +#include "CoronaCore/api/Api.h" +#include "CoronaCore/misc/Shaders/RoundEdgesShader.h" + +class CoronaRenderer; + +class RoundCorners : public Corona::Abstract::Map, Corona::RoundEdgesShader +{ +public: + CoronaRenderer *coronaRenderer; + RoundCorners(); + RoundCorners(MObject sObject); + ~RoundCorners(); + Corona::String mapName = "RoundCorners"; + int samplesCount = 10; + float radius = 0.01f; + + virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); + virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); + virtual Corona::Dir evalBump(const Corona::IShadeContext&, Corona::TextureCache*); + //virtual void renderTo(Corona::Bitmap& output){}; + virtual void getChildren(Corona::Stack&) {} + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { return true; }; + virtual Corona::String name() const { return mapName; }; + +}; + + +#endif \ No newline at end of file diff --git a/src/mayaToCorona/src/Corona/CoronaSettings.cpp b/src/mayaToCorona/src/Corona/CoronaSettings.cpp index 2ebc567..bbb2345 100644 --- a/src/mayaToCorona/src/Corona/CoronaSettings.cpp +++ b/src/mayaToCorona/src/Corona/CoronaSettings.cpp @@ -21,6 +21,11 @@ void CoronaRenderer::defineSettings() context.settings->set(Corona::PARAM_IMAGE_WIDTH, w); context.settings->set(Corona::PARAM_IMAGE_HEIGHT, h); + if (getBoolAttr("lockSamplingPattern",depFn, false)) + context.settings->set(Corona::PARAM_RANDOM_SEED, 1234); + else + context.settings->set(Corona::PARAM_RANDOM_SEED, 0); + if (renderGlobals->getUseRenderRegion()) { int left, bottom, right, top; @@ -39,7 +44,7 @@ void CoronaRenderer::defineSettings() if( renderer == 2) // vcm rendering context.settings->set(Corona::PARAM_RENDER_ENGINE, Corona::RENDER_ENGINE_VCM); - context.settings->set(Corona::PARAM_RESUME_RENDERING, false); + //context.settings->set(Corona::PARAM_RESUME_RENDERING, false); context.settings->set(Corona::PARAM_BUCKET_SIZE, getIntAttr("image_bucketSize", depFn, 64)); context.settings->set(Corona::PARAM_BUCKET_SAMPLES_PER_ITERATION, getIntAttr("buckets_initialSamples", depFn, 4)); @@ -61,7 +66,9 @@ void CoronaRenderer::defineSettings() if (getBoolAttr("exportSceneFile", depFn, false)) context.settings->set(Corona::PARAM_EXPORT_PATH, renderGlobals->exportSceneFileName.asChar()); - context.settings->set(Corona::PARAM_LOW_PRIORITY, true); // always render with low priority + //context.settings->set(Corona::PARAM_LOW_PRIORITY, true); // always render with low priority + context.settings->set(Corona::PARAM_THREAD_PRIORITY, Corona::IScheduler::PRIORITY_BELOW_NORMAL); // always render with low priority + Corona::DisplaceSubdivType subdivTypes[] = { Corona::DisplaceSubdivType::DISPLACE_SUBDIV_PROJECTED, Corona::DisplaceSubdivType::DISPLACE_SUBDIV_WORLD }; context.settings->set(Corona::PARAM_DISPLACE_SUBDIV_TYPE, subdivTypes[(int)getBoolAttr("displace_useProjectionSize", depFn, true)]); @@ -107,7 +114,9 @@ void CoronaRenderer::defineSettings() context.settings->set(Corona::PARAM_HDCACHE_POS_SENSITIVITY, getFloatAttr("gi_hdCache_posSensitivity", depFn, 20.0f)); context.settings->set(Corona::PARAM_HDCACHE_NORMAL_SENSITIVITY, getFloatAttr("gi_hdCache_normalSensitivity", depFn, 3.0f)); - float uhd_precision = 1.0f; + float uhd_precision = getFloatAttr("uhdPrecision", depFn, 1.0f); + context.settings->set(Corona::PARAM_UHDCACHE_PRECISION, uhd_precision); + int uhd_recordQuality = 512; float uhd_strictness = 0.075f; float uhd_msi = 3.0f; diff --git a/src/mayaToCorona/src/Corona/CoronaShaders.cpp b/src/mayaToCorona/src/Corona/CoronaShaders.cpp index d271194..8c274bb 100644 --- a/src/mayaToCorona/src/Corona/CoronaShaders.cpp +++ b/src/mayaToCorona/src/Corona/CoronaShaders.cpp @@ -1,4 +1,5 @@ #include +#include #include "CoronaShaders.h" #include "../mtco_common/mtco_mayaObject.h" #include "shadingtools/material.h" @@ -11,7 +12,9 @@ #include "../coronaOSL/coronaOSLMapUtil.h" #include "CoronaUtils.h" #include "CoronaMap.h" -#include "coronaAOShader.h" +#include "CoronaAOShader.h" +#include "CoronaFrontBack.h" +#include "CoronaWire.h" #include "world.h" #include "renderGlobals.h" @@ -24,7 +27,6 @@ void clearDataList() dataList.clear(); } - Corona::Rgb defineColor(MString& attributeName, MFnDependencyNode& depFn) { MColor col = getColorAttr(attributeName.asChar(), depFn); @@ -38,15 +40,15 @@ float defineFloat(MString& attributeName, MFnDependencyNode& depFn) // if we have something like a color attribute which we want to parse, we derive the // shading network from the attribute name and depFn -Corona::ColorOrMap defineAttribute(MString& attributeName, MObject& node) +Corona::ColorOrMap defineAttribute(MString& attributeName, MObject& node, OSL::OSLShadingNetworkRenderer *oslRenderer) { ShadingNetwork network(node); MFnDependencyNode depFn(node); - return defineAttribute(attributeName, depFn, network); + return defineAttribute(attributeName, depFn, network, oslRenderer); } -Corona::ColorOrMap defineAttribute(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn) +Corona::ColorOrMap defineAttribute(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, OSL::OSLShadingNetworkRenderer *oslRenderer) { MStatus stat; @@ -74,9 +76,19 @@ Corona::ColorOrMap defineAttribute(MString& attributeName, MFnDependencyNode& de texmap = new AoMap(connectedObject); return Corona::ColorOrMap(rgbColor, texmap); } + if (connectedNode.typeName() == "CoronaFrontBack") + { + texmap = new FrontBackMap(connectedObject); + return Corona::ColorOrMap(rgbColor, texmap); + } + if (connectedNode.typeName() == "CoronaWire") + { + texmap = new WireMap(connectedObject); + return Corona::ColorOrMap(rgbColor, texmap); + } } } - texmap = getOslTexMap(attributeName, depFn, sn); + texmap = getOslTexMap(attributeName, depFn, sn, oslRenderer); } else{ if (getPlugAttrType(attributeName.asChar(), depFn) == ATTR_TYPE::ATTR_TYPE_COLOR) @@ -105,14 +117,14 @@ Corona::ColorOrMap defineAttribute(MString& attributeName, MFnDependencyNode& de return Corona::ColorOrMap(rgbColor, texmap); } -Corona::SharedPtr defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn) +Corona::SharedPtr defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, OSL::OSLShadingNetworkRenderer *oslRenderer) { Corona::SharedPtr texmap = nullptr; if (isConnected("normalCamera", depFn, true, false)) { MString normalCamName = "normalCamera"; Logging::debug(MString("normal camera is connected")); - texmap = getOslTexMap(normalCamName, depFn, sn); + texmap = getOslTexMap(normalCamName, depFn, sn, oslRenderer); Logging::debug("Bump connected"); return texmap; } @@ -127,14 +139,12 @@ Corona::SharedPtr defineDefaultMaterial() return data.createMaterial(); } -Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, std::shared_ptr obj) +Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, std::shared_ptr obj, OSL::OSLShadingNetworkRenderer *oslRenderer, bool keepData) { float globalScaleFactor = 1.0f; if (MayaTo::getWorldPtr()->worldRenderGlobalsPtr != nullptr) globalScaleFactor = MayaTo::getWorldPtr()->worldRenderGlobalsPtr->scaleFactor; - MAYATO_OSL::initOSLUtil(); - if (materialNode == MObject::kNullObj) return defineDefaultMaterial(); @@ -147,8 +157,7 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, MFnDependencyNode depFn(materialNode); - // if we do a swatch render, we always want to create a new data object - if (MayaTo::getWorldPtr()->getRenderState() != MayaTo::MayaToWorld::WorldRenderState::RSTATESWATCHRENDERING) + if(keepData) { for (size_t i = 0; i < dataList.size(); i++) { @@ -181,7 +190,7 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, data.components.diffuse.setColor(Corona::Rgb(.7, .7, .7)); Logging::debug(MString("Defining layered base Material: ") + connectedMatName); - Corona::SharedPtr connectedBaseMat = defineCoronaMaterial(connectedMat, obj); + Corona::SharedPtr connectedBaseMat = defineCoronaMaterial(connectedMat, obj, oslRenderer, keepData); Corona::LayeredMtlData layerData; layerData.baseMtl = connectedBaseMat; Corona::LayeredMtlData::MtlEntry baseEntry; @@ -221,25 +230,18 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, Logging::debug(MString("Creating entry ") + pId + " Shader: " + nodeName); Corona::LayeredMtlData::MtlEntry entry; - entry.material = defineCoronaMaterial(inputs[0].node(), obj); + entry.material = defineCoronaMaterial(inputs[0].node(), obj, oslRenderer, keepData); MString attName = aPlug.name(); MStringArray strArray; attName.split('.', strArray); if (strArray.length() > 1) attName = strArray[strArray.length()-1]; - entry.amount = defineAttribute(attName, materialNode); + entry.amount = defineAttribute(attName, materialNode, oslRenderer); layerData.layers.push(entry); } } - //mtlData md; - //md.data = layerData; - //md.mtlName = depFn.name(); - //dataList.push_back(md); - return layerData.createMaterial(); - - //return defineDefaultMaterial(); } if (depFn.typeName() == "CoronaSurface") @@ -249,37 +251,37 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, //mtco_MapLoader loader; //Corona::SharedPtr texmap = loader.loadBitmap("C:/daten/3dprojects/mayaToCorona/sourceimages/redBlue.exr"); //data.components.diffuse = Corona::ColorOrMap(Corona::Rgb(0, 1, 0), texmap); - data.components.diffuse = defineAttribute(MString("diffuse"), depFn, network); - data.components.translucency = defineAttribute(MString("translucency"), depFn, network); - data.translucencyLevel = defineAttribute(MString("translucencyFraction"), depFn, network); - //data.translucencyLevel = defineAttribute(MString("translucencyLevel"), depFn, network); - data.components.reflect = defineAttribute(MString("reflectivity"), depFn, network); + data.components.diffuse = defineAttribute(MString("diffuse"), depFn, network, oslRenderer); + data.components.translucency = defineAttribute(MString("translucency"), depFn, network, oslRenderer); + data.translucencyLevel = defineAttribute(MString("translucencyFraction"), depFn, network, oslRenderer); + //data.translucencyLevel = defineAttribute(MString("translucencyLevel"), depFn, network, oslRenderer); + data.components.reflect = defineAttribute(MString("reflectivity"), depFn, network, oslRenderer); const Corona::BsdfLobeType bsdfType[] = { Corona::BSDF_ASHIKHMIN, Corona::BSDF_PHONG, Corona::BSDF_WARD }; - data.reflect.glossiness = defineAttribute(MString("reflectionGlossiness"), depFn, network); - data.reflect.fresnelIor = defineAttribute(MString("fresnelIor"), depFn, network); - data.reflect.anisotropy = defineAttribute(MString("anisotropy"), depFn, network); - data.reflect.anisoRotation = defineAttribute(MString("anisotropicRotation"), depFn, network); - data.components.refract = defineAttribute(MString("refractivity"), depFn, network); - data.refract.ior = defineAttribute(MString("refractionIndex"), depFn, network); - data.refract.glossiness = defineAttribute(MString("refractionGlossiness"), depFn, network); + data.reflect.glossiness = defineAttribute(MString("reflectionGlossiness"), depFn, network, oslRenderer); + data.reflect.fresnelIor = defineAttribute(MString("fresnelIor"), depFn, network, oslRenderer); + data.reflect.anisotropy = defineAttribute(MString("anisotropy"), depFn, network, oslRenderer); + data.reflect.anisoRotation = defineAttribute(MString("anisotropicRotation"), depFn, network, oslRenderer); + data.components.refract = defineAttribute(MString("refractivity"), depFn, network, oslRenderer); + data.refract.ior = defineAttribute(MString("refractionIndex"), depFn, network, oslRenderer); + data.refract.glossiness = defineAttribute(MString("refractionGlossiness"), depFn, network, oslRenderer); int glassType = getEnumInt("glassType", depFn); Corona::GlassMode glassModes[] = { Corona::GLASS_HYBRID, Corona::GLASS_ONESIDED, Corona::GLASS_TWOSIDED }; data.refract.glassMode = glassModes[glassType]; // round corners - without obj we are doing a swatch rendering. Here round corners does not make sense. - if (obj != nullptr) - { - MPlug rcMultiPlug = depFn.findPlug("roundCornersRadiusMultiplier"); - if (!rcMultiPlug.isNull()) - rcMultiPlug.setFloat(globalScaleFactor); - data.roundedCorners.radius = defineAttribute(MString("roundCornersRadius"), depFn, network); - //data.roundedCorners.radius = rcRadius * globalScaleFactor; - getInt(MString("roundCornersSamples"), depFn, data.roundedCorners.samples); - } + //if (obj != nullptr) + //{ + // MPlug rcMultiPlug = depFn.findPlug("roundCornersRadiusMultiplier"); + // if (!rcMultiPlug.isNull()) + // rcMultiPlug.setFloat(globalScaleFactor); + // data.roundedCorners.radius = defineAttribute(MString("roundCornersRadius"), depFn, network); + // //data.roundedCorners.radius = rcRadius * globalScaleFactor; + // getInt(MString("roundCornersSamples"), depFn, data.roundedCorners.samples); + //} // --- volume ---- - data.volume.attenuationColor = defineAttribute(MString("attenuationColor"), depFn, network); + data.volume.attenuationColor = defineAttribute(MString("attenuationColor"), depFn, network, oslRenderer); data.volume.attenuationDist = defineFloat(MString("attenuationDist"), depFn); data.volume.attenuationDist *= globalScaleFactor; data.volume.emissionColor = defineColor(MString("volumeEmissionColor"), depFn); @@ -287,13 +289,13 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, //// -- volume sss -- data.volume.meanCosine = getFloatAttr("volumeMeanCosine", depFn, 0.0f); - data.volume.scatteringAlbedo = defineAttribute(MString("volumeScatteringAlbedo"), depFn, network); + data.volume.scatteringAlbedo = defineAttribute(MString("volumeScatteringAlbedo"), depFn, network, oslRenderer); data.volume.sssMode = getBoolAttr("volumeSSSMode", depFn, false); - data.opacity = defineAttribute(MString("opacity"), depFn, network); + data.opacity = defineAttribute(MString("opacity"), depFn, network, oslRenderer); // ---- emission ---- - data.emission.color = defineAttribute(MString("emissionColor"), depFn, network); + data.emission.color = defineAttribute(MString("emissionColor"), depFn, network, oslRenderer); //bool disableSampling = false; //getBool("emissionDisableSampling", depFn, disableSampling); data.emission.disableSampling = true; // always disable sampling because we use it only in light shaders @@ -310,7 +312,7 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, Corona::AlphaInteraction alphaInteraction[] = { Corona::ALPHA_DEFAULT, Corona::ALPHA_SOLID, Corona::ALPHA_TRANSPARENT }; data.alpha = alphaInteraction[alphaMode]; - data.bump = defineBump(MString("bump"), depFn, network); + data.bump = defineBump(MString("bump"), depFn, network, oslRenderer); // setup all object specific data which needs a mayaobject if (obj != nullptr) @@ -399,26 +401,29 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, data.bgOverride = Corona::SharedPtr(new Corona::RaySwitcherMap(com)); if (doDirect) { - com = defineAttribute(MString("globalDirectOverride"), globalsNode, network); + com = defineAttribute(MString("globalDirectOverride"), globalsNode, network, oslRenderer); data.bgOverride->addOverride(com, Corona::RayType::RAY_DIRECT); } if (doReflect) { - com = defineAttribute(MString("globalReflectionOverride"), globalsNode, network); + com = defineAttribute(MString("globalReflectionOverride"), globalsNode, network, oslRenderer); data.bgOverride->addOverride(com, Corona::RayType::RAY_REFLECTED); } if (doRefract) { - com = defineAttribute(MString("globalRefractionOverride"), globalsNode, network); + com = defineAttribute(MString("globalRefractionOverride"), globalsNode, network, oslRenderer); data.bgOverride->addOverride(com, Corona::RayType::RAY_REFRACTED); } } } - mtlData md; - md.data = data; - md.mtlName = depFn.name(); - dataList.push_back(md); + if (keepData) + { + mtlData md; + md.data = data; + md.mtlName = depFn.name(); + dataList.push_back(md); + } return data.createMaterial(); } @@ -426,14 +431,14 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, { Corona::NativeMtlData data; // ---- emission ---- - data.emission.color = defineAttribute(MString("emissionColor"), depFn, network); + data.emission.color = defineAttribute(MString("emissionColor"), depFn, network, oslRenderer); data.emission.useTwoSidedEmission = getBoolAttr("doubleSidedEmission", depFn, false); //data.emission.color.setMap(new SidedMap); data.emission.emissionGlossiness = getFloatAttr("emissionGlossiness", depFn, 0.0f); //data.components.diffuse.setMap(new SidedMap); //bool disableSampling = false; //getBool("emissionDisableSampling", depFn, disableSampling); - data.opacity = defineAttribute(MString("opacity"), depFn, network); + data.opacity = defineAttribute(MString("opacity"), depFn, network, oslRenderer); // if the CoronaLight shader is not supposed to emit light, it should be used as something like a self illuminated BG // so we turn off visible in GI and disableSampling. if (getBoolAttr("emitLight", depFn, true)) @@ -531,10 +536,13 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, } } - mtlData md; - md.data = data; - md.mtlName = depFn.name(); - dataList.push_back(md); + if (keepData) + { + mtlData md; + md.data = data; + md.mtlName = depFn.name(); + dataList.push_back(md); + } return data.createMaterial(); } @@ -542,9 +550,9 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, { Corona::NativeMtlData data; // --- volume ---- - data.opacity = defineAttribute(MString("opacity"), depFn, network); + data.opacity = defineAttribute(MString("opacity"), depFn, network, oslRenderer); - data.volume.attenuationColor = defineAttribute(MString("attenuationColor"), depFn, network); + data.volume.attenuationColor = defineAttribute(MString("attenuationColor"), depFn, network, oslRenderer); data.volume.attenuationDist = defineFloat(MString("attenuationDist"), depFn); data.volume.attenuationDist *= globalScaleFactor; data.volume.emissionColor = defineColor(MString("volumeEmissionColor"), depFn); @@ -552,13 +560,16 @@ Corona::SharedPtr defineCoronaMaterial(MObject& materialNode, //// -- volume sss -- data.volume.meanCosine = getFloatAttr("volumeMeanCosine", depFn, 0.0f); - data.volume.scatteringAlbedo = defineAttribute(MString("volumeScatteringAlbedo"), depFn, network); + data.volume.scatteringAlbedo = defineAttribute(MString("volumeScatteringAlbedo"), depFn, network, oslRenderer); data.volume.sssMode = getBoolAttr("volumeSSSMode", depFn, false); - mtlData md; - md.data = data; - md.mtlName = depFn.name(); - dataList.push_back(md); + if (keepData) + { + mtlData md; + md.data = data; + md.mtlName = depFn.name(); + dataList.push_back(md); + } return data.createMaterial(); } diff --git a/src/mayaToCorona/src/Corona/CoronaShaders.h b/src/mayaToCorona/src/Corona/CoronaShaders.h index 6e077df..5bbe682 100644 --- a/src/mayaToCorona/src/Corona/CoronaShaders.h +++ b/src/mayaToCorona/src/Corona/CoronaShaders.h @@ -6,26 +6,28 @@ #include #include #include "CoronaCore/api/Api.h" +#include "../coronaOSL/oslRenderer.h" #include "shadingtools/material.h" -class MayaObject; +class MayaObject; -struct mtlData{ - MString mtlName; - Corona::NativeMtlData data; -}; -static std::vector dataList; + struct mtlData{ + MString mtlName; + Corona::NativeMtlData data; + }; + + static std::vector dataList; -Corona::ColorOrMap defineAttribute(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn); -Corona::ColorOrMap defineAttribute(MString& attributeName, MObject& node); -Corona::SharedPtr defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn); -Corona::Rgb defineColor(MString& attributeName, MFnDependencyNode& depFn); -float defineFloat(MString& attributeName, MFnDependencyNode& depFn); -Corona::SharedPtr defineCoronaMaterial(MObject& shadingGroup, std::shared_ptr obj = nullptr); -Corona::SharedPtr defineDefaultMaterial(); + Corona::ColorOrMap defineAttribute(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, OSL::OSLShadingNetworkRenderer *oslRenderer); + Corona::ColorOrMap defineAttribute(MString& attributeName, MObject& node, OSL::OSLShadingNetworkRenderer *oslRenderer); + Corona::SharedPtr defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, OSL::OSLShadingNetworkRenderer *oslRenderer); + Corona::Rgb defineColor(MString& attributeName, MFnDependencyNode& depFn); + float defineFloat(MString& attributeName, MFnDependencyNode& depFn); + Corona::SharedPtr defineCoronaMaterial(MObject& shadingGroup, std::shared_ptr obj = nullptr, OSL::OSLShadingNetworkRenderer *oslRenderer = nullptr, bool keepData = false); + Corona::SharedPtr defineDefaultMaterial(); -void clearDataList(); + void clearDataList(); #endif \ No newline at end of file diff --git a/src/mayaToCorona/src/Corona/CoronaShadersOrig.cpp b/src/mayaToCorona/src/Corona/CoronaShadersOrig.cpp index 7d30706..15dd97f 100644 --- a/src/mayaToCorona/src/Corona/CoronaShadersOrig.cpp +++ b/src/mayaToCorona/src/Corona/CoronaShadersOrig.cpp @@ -27,18 +27,18 @@ Corona::Stack dataArray; Corona::Stack> coronaMaterialStack; -void CoronaRenderer::defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, Corona::NativeMtlData& data) -{ - Corona::SharedPtr texmap = nullptr; - if( isConnected("normalCamera", depFn, true, false)) - { - //MString normalCamName = "normalCamera"; - //Logging::debug(MString("normal camera is connected")); - //texmap = getOslTexMap(normalCamName, depFn, sn); - //Logging::debug("Bump connected"); - //data.bump = texmap; - } -} +//void CoronaRenderer::defineBump(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, Corona::NativeMtlData& data) +//{ +// Corona::SharedPtr texmap = nullptr; +// if( isConnected("normalCamera", depFn, true, false)) +// { +// //MString normalCamName = "normalCamera"; +// //Logging::debug(MString("normal camera is connected")); +// //texmap = getOslTexMap(normalCamName, depFn, sn); +// //Logging::debug("Bump connected"); +// //data.bump = texmap; +// } +//} bool CoronaRenderer::assingExistingMat(MObject shadingGroup, std::shared_ptr mobj) { @@ -86,7 +86,6 @@ void CoronaRenderer::clearMaterialLists() { shaderArray.clear(); dataArray.clear(); - //definedMaterials.clear(); } @@ -116,7 +115,7 @@ void CoronaRenderer::defineMaterial(Corona::IInstance* instance, std::shared_ptr if (assingExistingMat(shadingGroupObject, obj)) return; - Corona::SharedPtr base = defineCoronaMaterial(surfaceShader, obj); + Corona::SharedPtr base = defineCoronaMaterial(surfaceShader, obj, this->oslRenderer, true); Corona::IMaterialSet ms = Corona::IMaterialSet(base); setRenderStats(ms, obj); @@ -168,26 +167,26 @@ void CoronaRenderer::defineMaterial(Corona::IInstance* instance, std::shared_ptr if (basePlug.isConnected()) { MObject inNode = getConnectedInNode(basePlug); - base = defineCoronaMaterial(inNode, nullptr); + base = defineCoronaMaterial(inNode, nullptr, this->oslRenderer, true); } if (reflectPlug.isConnected()) { MObject inNode = getConnectedInNode(reflectPlug); - reflect = defineCoronaMaterial(inNode, nullptr); + reflect = defineCoronaMaterial(inNode, nullptr, this->oslRenderer, true); } if (refractPlug.isConnected()) { MObject inNode = getConnectedInNode(refractPlug); - refract = defineCoronaMaterial(inNode, nullptr); + refract = defineCoronaMaterial(inNode, nullptr, this->oslRenderer, true); } if (directPlug.isConnected()) { MObject inNode = getConnectedInNode(directPlug); - direct = defineCoronaMaterial(inNode, nullptr); + direct = defineCoronaMaterial(inNode, nullptr, this->oslRenderer, true); } } else{ - base = defineCoronaMaterial(surfaceShader, obj); + base = defineCoronaMaterial(surfaceShader, obj, this->oslRenderer, true); } Corona::IMaterialSet ms = Corona::IMaterialSet(base); @@ -199,7 +198,7 @@ void CoronaRenderer::defineMaterial(Corona::IInstance* instance, std::shared_ptr } } else{ - Corona::SharedPtr mat = defineCoronaMaterial(MObject::kNullObj, nullptr); + Corona::SharedPtr mat = defineCoronaMaterial(MObject::kNullObj, nullptr, this->oslRenderer, true); Corona::IMaterialSet ms = Corona::IMaterialSet(mat); setRenderStats(ms, obj); obj->instance->addMaterial(ms); diff --git a/src/mayaToCorona/src/Corona/CoronaSky.cpp b/src/mayaToCorona/src/Corona/CoronaSky.cpp index 815999c..5aa5c3c 100644 --- a/src/mayaToCorona/src/Corona/CoronaSky.cpp +++ b/src/mayaToCorona/src/Corona/CoronaSky.cpp @@ -1,15 +1,48 @@ #include "Corona.h" #include "CoronaSky.h" +#include +#include "utilities/attrTools.h" +#include "CoronaUtils.h" SkyMap::SkyMap() { this->params = new Corona::SkyParams; }; + +SkyMap::SkyMap(MObject sObject) +{ + MFnDependencyNode depFn(sObject); + + this->params = new Corona::SkyParams; + + params->multiplier = getFloatAttr("pSkyMultiplier", depFn, 1.0); + int skyModel = getEnumInt("pSkyModel", depFn); + if (skyModel == 0) + params->mode = Corona::SkyModelType::MODEL_PREETHAM; + if (skyModel == 1) + params->mode = Corona::SkyModelType::MODEL_RAWAFAKE; + if (skyModel == 2) + params->mode = Corona::SkyModelType::MODEL_HOSEK; + params->groundColor = toCorona(getColorAttr("pSkyGroundColor", depFn)); + params->horizonBlur = getFloatAttr("pSkyHorizBlur", depFn, .1f); + params->skyAffectGround = getBoolAttr("pSkyAffectGround", depFn, true); + params->preetham.turbidity = getFloatAttr("pSkyPreethamTurb", depFn, 2.5f); + params->rawafake.horizon = toCorona(getColorAttr("pSkyHorizon", depFn)); + params->rawafake.horizon = toCorona(getColorAttr("pSkyZenith", depFn)); + params->rawafake.sunBleed = getFloatAttr("pSkySunBleed", depFn, 1.0f); + params->rawafake.sunFalloff = getFloatAttr("pSkySunFalloff", depFn, 3.0f); + params->rawafake.sunGlow = getFloatAttr("pSkySunGlow", depFn, 1.0f); + params->rawafake.sunSideGlow = getFloatAttr("pSkySunSideGlow", depFn, .2f); + + this->initSky(); +}; + SkyMap::~SkyMap(){}; void SkyMap::initSky() { - Corona::Sun sun = this->coronaRenderer->context.scene->getSun(); + std::shared_ptr renderer = std::static_pointer_cast(MayaTo::getWorldPtr()->worldRendererPtr); + Corona::Sun sun = renderer->context.scene->getSun(); this->init(this->params, &sun); } diff --git a/src/mayaToCorona/src/Corona/CoronaSky.h b/src/mayaToCorona/src/Corona/CoronaSky.h index 9d82255..c702434 100644 --- a/src/mayaToCorona/src/Corona/CoronaSky.h +++ b/src/mayaToCorona/src/Corona/CoronaSky.h @@ -1,6 +1,7 @@ #ifndef CORONA_SKY_MAP #define CORONA_SKY_MAP +#include #include "CoronaCore/api/Api.h" #include "CoronaCore/misc/Shaders/SkyShader.h" @@ -11,8 +12,10 @@ class SkyMap : public Corona::Abstract::Map, Corona::SkyShader public: CoronaRenderer *coronaRenderer; SkyMap(); + SkyMap(MObject sObject); ~SkyMap(); Corona::SkyParams *params; + Corona::String mapName = "SkyMap"; virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); @@ -21,6 +24,9 @@ class SkyMap : public Corona::Abstract::Map, Corona::SkyShader void initSky(); virtual void getChildren(Corona::Stack&) {} virtual Corona::Rgb sc(const int samples = 1000); + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { return true; }; + virtual Corona::String name() const { return mapName; }; + }; diff --git a/src/mayaToCorona/src/Corona/CoronaTestScene.h b/src/mayaToCorona/src/Corona/CoronaTestScene.h index eb78958..cde1991 100644 --- a/src/mayaToCorona/src/Corona/CoronaTestScene.h +++ b/src/mayaToCorona/src/Corona/CoronaTestScene.h @@ -86,6 +86,23 @@ void createScene(IScene* scene) { } +void createSceneMini(IScene* scene) { + scene->setBackground(ColorOrMap(Rgb::WHITE*0.75f)); + scene->getCamera().createPerspective(AnimatedPos(Pos(-25, 25, 12)), AnimatedPos(Pos(0.f, 0.f, -5.f)), AnimatedDir(Dir::UNIT_Z), AnimatedFloat(DEG_TO_RAD(45.f))); + IGeometryGroup* geom = scene->addGeomGroup(); + SphereData sphere; + geom->addPrimitive(sphere); + AffineTm tm2 = AffineTm::IDENTITY; + IInstance* instance = geom->addInstance(tm2); + NativeMtlData data; + data.components.diffuse.setColor(Rgb(FLT_RAND(), FLT_RAND(), FLT_RAND())); + instance->addMaterial(IMaterialSet(data.createMaterial())); + + // one custom light + scene->addLightShader(new MyLight); +} + + // function that gets called from another thread to do the heavy lifting - scene creating and rendering void workFunction(Context *context) { diff --git a/src/mayaToCorona/src/Corona/CoronaUtils.cpp b/src/mayaToCorona/src/Corona/CoronaUtils.cpp index 90c0313..f9a0cc3 100644 --- a/src/mayaToCorona/src/Corona/CoronaUtils.cpp +++ b/src/mayaToCorona/src/Corona/CoronaUtils.cpp @@ -93,13 +93,11 @@ void setAnimatedTransformationMatrix(Corona::AnimatedAffineTm& atm, std::shared_ // a segment contains start and end, 2 mb steps are one segment, 3 mb steps are 2 segments bool doMb = false; - MMatrix globalConversionMatrix; - globalConversionMatrix.setToIdentity(); + MMatrix globalConversionMatrix = MayaTo::getWorldPtr()->globalConversionMatrix; if (MayaTo::getWorldPtr()->worldRenderGlobalsPtr != nullptr) { doMb = MayaTo::getWorldPtr()->worldRenderGlobalsPtr->doMb; - globalConversionMatrix = MayaTo::getWorldPtr()->worldRenderGlobalsPtr->globalConversionMatrix; } int numSegments = (obj->transformMatrices.size() - 1) * ((int)doMb); atm.setSegments(numSegments); @@ -122,14 +120,7 @@ void setAnimatedTransformationMatrix(Corona::AnimatedAffineTm& atm, MMatrix& mat MMatrix to, from; int numSegments = 0; atm.setSegments(numSegments); - MMatrix globalConversionMatrix; - globalConversionMatrix.setToIdentity(); - - if (MayaTo::getWorldPtr()->worldRenderGlobalsPtr != nullptr) - { - globalConversionMatrix = MayaTo::getWorldPtr()->worldRenderGlobalsPtr->globalConversionMatrix; - } - + MMatrix globalConversionMatrix = MayaTo::getWorldPtr()->globalConversionMatrix; for (size_t mId = 0; mId < (numSegments + 1); mId++) { diff --git a/src/mayaToCorona/src/Corona/CoronaWire.cpp b/src/mayaToCorona/src/Corona/CoronaWire.cpp new file mode 100644 index 0000000..76055d1 --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaWire.cpp @@ -0,0 +1,47 @@ +#include "Corona.h" +#include "CoronaWire.h" +#include +#include "utilities/attrTools.h" + +WireMap::WireMap(MObject shaderObject) +{ + MFnDependencyNode depFn(shaderObject); + useWorldSpace = getBoolAttr("useWorldSpace", depFn, false); + showVertices = getBoolAttr("showVertices", depFn, false); + allEdges = getBoolAttr("allEdges", depFn, false); + showEdges = getBoolAttr("showEdges", depFn, true); + edgeWidth = getFloatAttr("edgeWidth", depFn, 1.0f); + vertexWidth = getFloatAttr("vertexWidth", depFn, 1.0f); +}; + +WireMap::~WireMap(){}; + +Corona::Rgb WireMap::evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) +{ + outAlpha = 1.0f; + float f = 1.0f; + Corona::WireShader::Result res = eval(context); + if (res == Corona::WireShader::Result::HIT_EDGE) + return Corona::Rgb(1.0); + if (res == Corona::WireShader::Result::HIT_VERTEX) + return Corona::Rgb(1.0); + if (res == Corona::WireShader::Result::HIT_NONE) + return Corona::Rgb(0.0); + return Corona::Rgb(0.0); +} + +float WireMap::evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha) +{ + return evalColor(context, cache, outAlpha).grayValue(); +} + +Corona::Dir WireMap::evalBump(const Corona::IShadeContext&, Corona::TextureCache*) +{ + STOP; //currently not supported +} + +void WireMap::renderTo(Corona::Bitmap& output) +{ + STOP; //currently not supported +} + diff --git a/src/mayaToCorona/src/Corona/CoronaWire.h b/src/mayaToCorona/src/Corona/CoronaWire.h new file mode 100644 index 0000000..34379bb --- /dev/null +++ b/src/mayaToCorona/src/Corona/CoronaWire.h @@ -0,0 +1,26 @@ +#ifndef CORONA_WIRE_MAP +#define CORONA_WIRE_MAP + +#include +#include "CoronaCore/api/Api.h" +#include "CoronaCore/misc/Shaders/WireShader.h" + +class WireMap : public Corona::Abstract::Map, Corona::WireShader +{ +public: + WireMap(MObject sObject); + ~WireMap(); + Corona::String mapName = "WireMap"; + + virtual Corona::Rgb evalColor(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); + virtual float evalMono(const Corona::IShadeContext& context, Corona::TextureCache* cache, float& outAlpha); + virtual Corona::Dir evalBump(const Corona::IShadeContext&, Corona::TextureCache*); + virtual void renderTo(Corona::Bitmap& output); + virtual void getChildren(Corona::Stack&) {} + virtual bool exportMap(Corona::IResourceManager& resourceManager, Corona::XmlWriterNode& outXml) const { return true; }; + virtual Corona::String name() const { return mapName; }; + +}; + + +#endif \ No newline at end of file diff --git a/src/mayaToCorona/src/Corona/CoronaWorld.cpp b/src/mayaToCorona/src/Corona/CoronaWorld.cpp index cd94b23..fd497ae 100644 --- a/src/mayaToCorona/src/Corona/CoronaWorld.cpp +++ b/src/mayaToCorona/src/Corona/CoronaWorld.cpp @@ -10,12 +10,6 @@ namespace MayaTo{ void MayaToWorld::cleanUp() { - OSL::OSLShadingNetworkRenderer *r = (OSL::OSLShadingNetworkRenderer *)this->getObjPtr("oslRenderer"); - if (r != nullptr) - delete r; - r = (OSL::OSLShadingNetworkRenderer *)this->getObjPtr("oslSwatchRenderer"); - if (r != nullptr) - delete r; mtco_SwatchRendererInterface::cleanUpStaticData(); } @@ -29,18 +23,6 @@ namespace MayaTo{ void MayaToWorld::initialize() { - OSL::OSLShadingNetworkRenderer *r = new OSL::OSLShadingNetworkRenderer(); - this->addObjectPtr("oslRenderer", r); - - OSL::OSLShadingNetworkRenderer *swatchRenderer = new OSL::OSLShadingNetworkRenderer(); - this->addObjectPtr("oslSwatchRenderer", swatchRenderer); - - std::string oslShaderPath = (getRendererHome() + "shaders").asChar(); - Logging::debug(MString("setting osl shader search path to: ") + oslShaderPath.c_str()); - r->setShaderSearchPath(oslShaderPath); - r->setup(); - swatchRenderer->setShaderSearchPath(oslShaderPath); - swatchRenderer->setup(); mtco_SwatchRendererInterface::initializeStaticData(); setCanDoIPR(false); } @@ -63,4 +45,14 @@ namespace MayaTo{ { getWorldPtr()->afterNewScene(); } + + void MayaToWorld::setRendererUnit() + { + this->rendererUnit = MDistance::kMeters; + } + + void MayaToWorld::setRendererAxis() + { + this->rendererAxis = ZUp; + } } \ No newline at end of file diff --git a/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.cpp b/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.cpp index ceca028..1bd8413 100644 --- a/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.cpp +++ b/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.cpp @@ -3,23 +3,18 @@ static Logging logger; -Corona::SharedPtr getOslTexMap(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn) +Corona::SharedPtr getOslTexMap(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, OSL::OSLShadingNetworkRenderer *oslRenderer) { MStatus status; - OSL::OSLShadingNetworkRenderer *oslRenderer; - MayaTo::MayaToWorld::WorldRenderType rType = MayaTo::getWorldPtr()->getRenderType(); - if ((rType == MayaTo::MayaToWorld::WorldRenderType::SWATCHRENDER)) - { - oslRenderer = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslSwatchRenderer"); - } - else{ - oslRenderer = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslRenderer"); - } + + MAYATO_OSLUTIL::OSLUtilClass OSLShaderClass; + OSLShaderClass.oslRenderer = oslRenderer; size_t numNodes = sn.shaderList.size(); MString OSLInterfaceName = depFn.name() + "_" + attributeName + "_OSLInterface"; MString shaderGroupName = depFn.name() + "_" + attributeName + "_OSLShadingGroup"; OSL::ShaderGroupRef shaderGroup = oslRenderer->shadingsys->ShaderGroupBegin(shaderGroupName.asChar()); + OSLShaderClass.group = shaderGroup.get(); MObject thisMObject = depFn.object(); MString outPlugName; @@ -28,19 +23,19 @@ Corona::SharedPtr getOslTexMap(MString& attributeName, MF Logging::debug(MString("getOslTexMap: ") + connectedObjectName + "." + outPlugName + " is connected with " + depFn.name() + "." + attributeName); MPlug shaderPlug = depFn.findPlug(attributeName); - MAYATO_OSL::createOSLProjectionNodes(shaderPlug); + OSLShaderClass.createOSLProjectionNodes(shaderPlug); for (int shadingNodeId = 0; shadingNodeId < numNodes; shadingNodeId++) { ShadingNode snode = sn.shaderList[shadingNodeId]; Logging::debug(MString("ShadingNode Id: ") + shadingNodeId + " ShadingNode name: " + snode.fullName); - MAYATO_OSL::createOSLHelperNodes(sn.shaderList[shadingNodeId]); - MAYATO_OSL::createOSLShadingNode(sn.shaderList[shadingNodeId]); - MAYATO_OSL::connectProjectionNodes(sn.shaderList[shadingNodeId].mobject); + OSLShaderClass.createOSLHelperNodes(sn.shaderList[shadingNodeId]); + OSLShaderClass.createOSLShadingNode(sn.shaderList[shadingNodeId]); + OSLShaderClass.connectProjectionNodes(sn.shaderList[shadingNodeId].mobject); if (snode.fullName == connectedObjectName.asChar()) { - MAYATO_OSL::createOSLHelperNodes(sn.shaderList[sn.shaderList.size() - 1]); + OSLShaderClass.createOSLHelperNodes(sn.shaderList[sn.shaderList.size() - 1]); Logging::debug(MString("connected node found: ") + snode.fullName + " search output attr."); for (size_t outId = 0; outId < snode.outputAttributes.size(); outId++) @@ -56,9 +51,9 @@ Corona::SharedPtr getOslTexMap(MString& attributeName, MF if ((sa.type == "color") || (sa.type == "vector")) { // lets see if we have a color helper node - MString helperNodeName = MAYATO_OSL::createPlugHelperNodeName(attributeName.asChar(), thisMObject, false); + MString helperNodeName = OSLShaderClass.createPlugHelperNodeName(attributeName.asChar(), thisMObject, false); Logging::debug(MString("Interface connection - color/vector attribute ") + sa.name.c_str() + " search for helper node " + helperNodeName); - if (MAYATO_OSL::doesOSLNodeAlreadyExist(helperNodeName)) + if (OSLShaderClass.doesOSLNodeAlreadyExist(helperNodeName)) { Logging::debug(MString("Found helper node name.")); sourceParam = "outputValue"; @@ -117,7 +112,6 @@ Corona::SharedPtr getOslTexMap(MString& attributeName, MF Corona::SharedPtr oslMapp = new OSLMap; OSLMap *oslMap = (OSLMap *)oslMapp.getReference(); - oslMap->oslRenderer = oslRenderer; oslMap->shaderGroup = shaderGroup; diff --git a/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.h b/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.h index 6ff26b7..116ad9b 100644 --- a/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.h +++ b/src/mayaToCorona/src/coronaOSL/coronaOSLMapUtil.h @@ -12,7 +12,7 @@ #include #include "CoronaCore/api/Api.h" -Corona::SharedPtr getOslTexMap(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn); +Corona::SharedPtr getOslTexMap(MString& attributeName, MFnDependencyNode& depFn, ShadingNetwork& sn, OSL::OSLShadingNetworkRenderer *oslRenderer); #endif \ No newline at end of file diff --git a/src/mayaToCorona/src/coronaOSL/oslRenderer.cpp b/src/mayaToCorona/src/coronaOSL/oslRenderer.cpp index 8dd3f7a..478be73 100644 --- a/src/mayaToCorona/src/coronaOSL/oslRenderer.cpp +++ b/src/mayaToCorona/src/coronaOSL/oslRenderer.cpp @@ -3,6 +3,7 @@ #include "OSL/oslexec.h" #include "OSL/genclosure.h" #include "utilities/logging.h" +#include "utilities/tools.h" using namespace OSL; @@ -450,23 +451,20 @@ void OSLShadingNetworkRenderer::setup() { if (this->shadingsys != nullptr) delete this->shadingsys; + + std::string oslShaderPath = (getRendererHome() + "shaders").asChar(); + Logging::debug(MString("setting osl shader search path to: ") + oslShaderPath.c_str()); + setShaderSearchPath(oslShaderPath); + this->shadingsys = OSL::ShadingSystem::create (&renderer, nullptr, &this->errorHandler); OIIO::TextureSystem *ts = this->shadingsys->texturesys(); ts->attribute("grey_to_rgb", 1); this->shadingsys->attribute("lockgeom", 1); this->shadingsys->attribute("searchpath:shader", this->shaderSearchPath); - //this->shadingsys->attribute("strict_messages", true); - //this->shadingsys->attribute("debug", 2); - //this->shadingsys->attribute("buffer_printf", 0); const char *n = "Cout"; shadingsys->attribute("renderer_outputs", TypeDesc(TypeDesc::STRING,1),&n); - //std::vector aovnames(2); - //aovnames[0] = "Cout"; - //aovnames[1] = "fout"; - //shadingsys->attribute ("renderer_outputs", TypeDesc(TypeDesc::STRING,(int)aovnames.size()), &aovnames[0]); - for (int i = 0; i < 256; i++) { if (ctx[i] != nullptr) @@ -500,88 +498,60 @@ OSL_NAMESPACE_EXIT namespace MAYATO_OSL { - void createOSLShader(MString& shadingNodeType, MString& shaderName, OSLParamArray& paramArray, MString type) - { - //OSL::OSLShadingNetworkRenderer *r = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslRenderer"); - OSL::OSLShadingNetworkRenderer *r; - MayaTo::MayaToWorld::WorldRenderType rType = MayaTo::getWorldPtr()->getRenderType(); - if ((rType == MayaTo::MayaToWorld::WorldRenderType::SWATCHRENDER)) - { - r = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslSwatchRenderer"); - }else - { - r = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslRenderer"); - } - - if (r == nullptr) - { - std::cerr << "error createOSLShader: OSL renderer == nullptr\n"; - return; - } + void createOSLShader(MString& shadingNodeType, MString& shaderName, OSLParamArray& paramArray) + {} - for (size_t i = 0; i < paramArray.size(); i++) - { - MString name = paramArray[i].name; - OSL::TypeDesc type = paramArray[i].type; - std::string tmp; - float vec[3]; - float m[4][4]; - void *val = nullptr; - if (type == OSL::TypeDesc::TypeFloat) - val = boost::get(¶mArray[i].value); - if (type == OSL::TypeDesc::TypeInt) - val = boost::get(¶mArray[i].value); - if (type == OSL::TypeDesc::TypeVector) - { - SimpleVector &v = boost::get(paramArray[i].value); - vec[0] = v.f[0]; - vec[1] = v.f[1]; - vec[2] = v.f[2]; - val = vec; - } - if (type == OSL::TypeDesc::TypeString) - { - tmp = boost::get(paramArray[i].value); - const OIIO::string_ref p = tmp; - if (!r->shadingsys->Parameter(name.asChar(), type, &p)) - Logging::debug(MString("Problem! createOSLShader defining string parameter: ") + name); - } - if (type == OSL::TypeDesc::TypeMatrix) - { - SimpleMatrix &v = boost::get(paramArray[i].value); - val = v.f; - } - if (type != OSL::TypeDesc::TypeString) - if (!r->shadingsys->Parameter(name.asChar(), type, val)) - Logging::debug(MString("Problem! createOSLShader defining parameter: ") + name); - } - if(!r->shadingsys->Shader("surface", shadingNodeType.asChar(), shaderName.asChar())) - Logging::debug(MString("Problem! createOSLShader defining shader: ") + shaderName); + void connectOSLShaders(ConnectionArray& ca) + {} +}; +void MAYATO_OSLUTIL::OSLUtilClass::connectOSLShaders(MAYATO_OSL::ConnectionArray& ca) +{ + for (size_t i = 0; i < ca.size(); i++) + { + if (!oslRenderer->shadingsys->ConnectShaders(ca[i].sourceNode.asChar(), ca[i].sourceAttribute.asChar(), ca[i].destNode.asChar(), ca[i].destAttribute.asChar())) + Logging::debug(MString("Problem! connectOSLShaders defining connection: ") + ca[i].sourceNode + " to " + ca[i].destNode); } +} - void connectOSLShaders(ConnectionArray& ca) +void MAYATO_OSLUTIL::OSLUtilClass::createOSLShader(MString& shaderNodeType, MString& shaderName, MAYATO_OSL::OSLParamArray& paramArray) +{ + for (size_t i = 0; i < paramArray.size(); i++) { - //OSL::OSLShadingNetworkRenderer *r = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslRenderer"); - OSL::OSLShadingNetworkRenderer *r; - MayaTo::MayaToWorld::WorldRenderType rType = MayaTo::getWorldPtr()->getRenderType(); - if ((rType == MayaTo::MayaToWorld::WorldRenderType::BATCHRENDER) || (rType == MayaTo::MayaToWorld::WorldRenderType::UIRENDER)) + MString name = paramArray[i].name; + OSL::TypeDesc type = paramArray[i].type; + std::string tmp; + float vec[3]; + float m[4][4]; + void *val = nullptr; + if (type == OSL::TypeDesc::TypeFloat) + val = boost::get(¶mArray[i].value); + if (type == OSL::TypeDesc::TypeInt) + val = boost::get(¶mArray[i].value); + if (type == OSL::TypeDesc::TypeVector) { - r = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslRenderer"); + MAYATO_OSL::SimpleVector &v = boost::get(paramArray[i].value); + vec[0] = v.f[0]; + vec[1] = v.f[1]; + vec[2] = v.f[2]; + val = vec; } - if ((rType == MayaTo::MayaToWorld::WorldRenderType::SWATCHRENDER)) + if (type == OSL::TypeDesc::TypeString) { - r = (OSL::OSLShadingNetworkRenderer *)MayaTo::getObjPtr("oslSwatchRenderer"); + tmp = boost::get(paramArray[i].value); + const OIIO::string_ref p = tmp; + if (!oslRenderer->shadingsys->Parameter(name.asChar(), type, &p)) + Logging::debug(MString("Problem! createOSLShader defining string parameter: ") + name); } - if (r == nullptr) + if (type == OSL::TypeDesc::TypeMatrix) { - std::cerr << "error connectOSLShaders: OSL renderer == nullptr\n"; - return; - } - for (size_t i = 0; i < ca.size(); i++) - { - if (!r->shadingsys->ConnectShaders(ca[i].sourceNode.asChar(), ca[i].sourceAttribute.asChar(), ca[i].destNode.asChar(), ca[i].destAttribute.asChar())) - Logging::debug(MString("Problem! connectOSLShaders defining connection: ") + ca[i].sourceNode + " to " + ca[i].destNode); + MAYATO_OSL::SimpleMatrix &v = boost::get(paramArray[i].value); + val = v.f; } + if (type != OSL::TypeDesc::TypeString) + if (!oslRenderer->shadingsys->Parameter(name.asChar(), type, val)) + Logging::debug(MString("Problem! createOSLShader defining parameter: ") + name); } -}; \ No newline at end of file + if (!oslRenderer->shadingsys->Shader("surface", shaderNodeType.asChar(), shaderName.asChar())) + Logging::debug(MString("Problem! createOSLShader defining shader: ") + shaderName); +} diff --git a/src/mayaToCorona/src/coronaOSL/oslRenderer.h b/src/mayaToCorona/src/coronaOSL/oslRenderer.h index 623ee37..77051d7 100644 --- a/src/mayaToCorona/src/coronaOSL/oslRenderer.h +++ b/src/mayaToCorona/src/coronaOSL/oslRenderer.h @@ -102,7 +102,8 @@ class OSLShadingNetworkRenderer public: SimpleRenderer renderer; OSL::ShadingSystem *shadingsys; - + std::string rendererName; + int resX, resY; ErrorHandler errorHandler; ShaderGroupRef shadergroup; @@ -156,8 +157,8 @@ OSL_NAMESPACE_EXIT namespace MAYATO_OSL { - void createOSLShader(MString& shaderName, OSLParamArray& paramArray, MString type = "shader"); //overwrite this in renderer specific version - void connectOSLShaders(ConnectionArray& ca); //overwrite this in renderer specific version + void createOSLShader(MString& shaderName, OSLParamArray& paramArray, MString type, OSL::OSLShadingNetworkRenderer *oslRenderer); //overwrite this in renderer specific version + void connectOSLShaders(ConnectionArray& ca, OSL::OSLShadingNetworkRenderer *oslRenderer); //overwrite this in renderer specific version }; diff --git a/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.cpp b/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.cpp index 1378be5..093c89d 100644 --- a/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.cpp +++ b/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.cpp @@ -1,246 +1,607 @@ #include "mtco_mayaRenderer.h" #include "../Corona/CoronaShaders.h" +#include "../Corona/CoronaCamera.h" +#include "../Corona/CoronaGeometry.h" +#include "../Corona/CoronaUtils.h" +#include "../Corona/CoronaMap.h" #include "utilities/logging.h" +#include "utilities/tools.h" +#include "utilities/attrTools.h" +#include "world.h" #if MAYA_API_VERSION >= 201600 -#include #include #include #include #define kNumChannels 4 -bool mtco_MayaRenderer::running = false; +#define CORONA_DEFAULT_CONFIG_FILENAME "Config-" + Corona::toStr(Corona::PropertyDescriptor::descriptorsHash()) + ".conf" -mtco_MayaRenderer::mtco_MayaRenderer() -{ - // Set a default width and height value - width = height = 64; - renderBuffer = (float*)malloc(width*height*kNumChannels*sizeof(float)); - mtco_MayaRenderer::running = false; +float FLT_RAND() { + return float(rand()) / RAND_MAX; } -bool mtco_MayaRenderer::isRunningAsync() -{ - MGlobal::displayInfo("isRunningAsync"); - return true; -} -void* mtco_MayaRenderer::creator() +mtco_MayaRenderer::mtco_MayaRenderer() { - return new mtco_MayaRenderer(); -} + width = height = initialSize; + renderBuffer = (float*)malloc(width*height*kNumChannels*sizeof(float)); -void mtco_MayaRenderer::render() -{ - ProgressParams progressParams; Corona::LicenseInfo li = Corona::ICore::getLicenseInfo(); if (!li.isUsable()) { return; } - Context *c = new Context(); + oslRenderer->setup(); + + context = new Context(); - c->core = Corona::ICore::createInstance(); - c->scene = c->core->createScene(); - c->logger = new mtco_Logger(c->core); - c->settings = new Settings(); + context->core = Corona::ICore::createInstance(); + context->scene = context->core->createScene(); + + context->logger = new mtco_Logger(context->core); + context->settings = new Settings(); + + Corona::ConfParser parser; + Corona::String resPath = (getRendererHome() + "resources/").asChar(); + parser.parseFile(resPath + CORONA_DEFAULT_CONFIG_FILENAME, context->settings, Corona::ConfParser::CREATE_IF_NONEXISTENT); Corona::ICore::MtlSceneConfig config; config.lightsSize = 1.0f; config.lightsIntensity = 1.0f; - Corona::SharedPtr mat = defineDefaultMaterial(); - //Corona::SharedPtr mat = defineCoronaMaterial(dependNode); - Corona::IMaterialSet ms = Corona::IMaterialSet(mat); - config.materials.push(ms); - c->core->setupMtlPreviewScene(config, c->scene, c->settings); - c->settings->set(Corona::PARAM_IMAGE_WIDTH, width); - c->settings->set(Corona::PARAM_IMAGE_HEIGHT, height); - c->fb = c->core->createFb(); - c->fb->initFb(c->settings, c->renderPasses); - - // test that the now ready scene and settings do not have any errors - c->core->sanityCheck(c->scene); - c->core->sanityCheck(c->settings); - - c->core->beginSession(c->scene, c->settings, c->fb, c->logger, Corona::ICore::AdditionalInfo()); - c->core->renderFrame(); - c->core->endSession(); - - { - Corona::Pixel p = c->fb->getImageSize(); - int width = p.x; - int height = p.y; - size_t numPixels = width * height; - uint numPixelsInRow = width; - bool doToneMapping = true; - Corona::Pixel firstPixelInRow(0, 0); - Corona::Rgb *outColors = new Corona::Rgb[numPixelsInRow]; - float *outAlpha = new float[numPixelsInRow]; - for (uint rowId = 0; rowId < p.y; rowId++) - { - memset(outAlpha, 0, numPixelsInRow * sizeof(float)); - firstPixelInRow.y = rowId; - try{ - c->fb->getRow(firstPixelInRow, numPixelsInRow, Corona::CHANNEL_BEAUTY, doToneMapping, false, outColors, outAlpha); - } - catch (char *errorMsg){ - Logging::error(errorMsg); - break; - } - uint rowPos = (height - 1 - rowId) * numPixelsInRow; - for (int x = 0; x < numPixelsInRow; x++) - { - int index = (rowPos + x) * kNumChannels; - *(renderBuffer + index) = outColors[x].r(); - *(renderBuffer + index + 1) = outColors[x].g(); - *(renderBuffer + index + 2) = outColors[x].b(); - *(renderBuffer + index + 3) = 1.0f; - } - } - delete[] outColors; - delete[] outAlpha; - } - delete c->logger; - delete c->settings; - c->core->destroyScene(c->scene); - c->core->destroyFb(c->fb); - Corona::ICore::destroyInstance(c->core); - Logging::debug(MString("Swatch rendering done.")); - delete c; + context->settings->set(Corona::PARAM_RENDER_ENGINE, Corona::RENDER_ENGINE_PROGRESSIVE); + context->settings->set(Corona::PARAM_MINIMIZE_PRECOMP, true); + //limit the passes + context->settings->set(Corona::PARAM_PROGRESSIVE_PASS_LIMIT, 10); - //progressParams.progress = 0.0; - //progress(progressParams); + context->settings->set(Corona::PARAM_IMAGE_WIDTH, width); + context->settings->set(Corona::PARAM_IMAGE_HEIGHT, height); - //The image is R32G32B32A32_Float format - refreshParams.bottom = 0; - refreshParams.top = height - 1; - refreshParams.bytesPerChannel = sizeof(float); - refreshParams.channels = kNumChannels; - refreshParams.left = 0; - refreshParams.right = width - 1; - refreshParams.width = width; - refreshParams.height = height; + context->core->sanityCheck(context->settings); + context->fb = context->core->createFb(); + context->fb->initFb(context->settings, context->renderPasses); - refreshParams.data = renderBuffer; - refresh(refreshParams); + context->scene->getCamera().createPerspective(Corona::AnimatedPos(Corona::Pos(-25, 25, 12)), Corona::AnimatedPos(Corona::Pos(0.f, 0.f, -5.f)), Corona::AnimatedDir(Corona::Dir::UNIT_Z), Corona::AnimatedFloat(Corona::DEG_TO_RAD(45.f))); - //std::this_thread::sleep_for(std::chrono::milliseconds(5000)); + context->core->sanityCheck(context->scene); + + context->core->beginSession(context->scene, context->settings, context->fb, context->logger, Corona::ICore::AdditionalInfo()); + good = true; +} + +mtco_MayaRenderer::~mtco_MayaRenderer() +{ + if (!good)return; + delete oslRenderer; + finishRendering(); + context->core->endSession(); + delete context->logger; + delete context->settings; + context->core->destroyScene(context->scene); + context->core->destroyFb(context->fb); + Corona::ICore::destroyInstance(context->core); +} + +bool mtco_MayaRenderer::isRunningAsync() +{ + Logging::debug("isRunningAsync"); + return true; +} + +void* mtco_MayaRenderer::creator() +{ + return new mtco_MayaRenderer(); +} + +void mtco_MayaRenderer::render() +{ + Logging::debug("Rendering..."); + ProgressParams progressParams; + progressParams.progress = 0.0f; + progress(progressParams); + isRendering = true; + context->core->renderFrame(); + isRendering = false; progressParams.progress = 1.0f; progress(progressParams); } +static void startRenderThread(mtco_MayaRenderer* renderPtr) +{ + renderPtr->render(); +} + +static void startFbThread(mtco_MayaRenderer* renderPtr) +{ + if (!renderPtr->good)return; + while (renderPtr->isRendering) + { + Logging::debug("FbThread sleeping..."); + std::this_thread::sleep_for(std::chrono::milliseconds(renderPtr->refreshInteraval * 1000)); + renderPtr->framebufferCallback(); + } +} + +void mtco_MayaRenderer::finishRendering() +{ + if (good) + this->context->core->cancelRender(); + if (this->renderThread.joinable()) + this->renderThread.join(); + if (this->fbThread.joinable()) + this->fbThread.join(); +} + MStatus mtco_MayaRenderer::startAsync(const JobParams& params) { - MGlobal::displayInfo("startAsync:"); - MGlobal::displayInfo(MString("\tJobDescr: ") + params.description); - //if ((width == 0) || (height == 0)) - // return MS::kFailure; - mtco_MayaRenderer::running = true; - render(); + //mtco_MayaRenderer::running = true; + //render(); return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::stopAsync() { - MGlobal::displayInfo("stopAsync"); - mtco_MayaRenderer::running = false; + Logging::debug("stopAsync"); + finishRendering(); return MS::kSuccess; } MStatus mtco_MayaRenderer::beginSceneUpdate() { - MGlobal::displayInfo("beginSceneUpdate"); - if (mtco_MayaRenderer::running) - { - MGlobal::displayInfo("Rendering in progress, stopping rendering."); - } + Logging::debug("beginSceneUpdate"); + finishRendering(); + return MStatus::kSuccess; +}; + +MStatus mtco_MayaRenderer::endSceneUpdate() +{ + Logging::debug("endSceneUpdate"); + completlyInitialized = true; + if (good) + this->context->core->uncancelRender(); + this->renderThread = std::thread(startRenderThread, this); + this->fbThread = std::thread(startFbThread, this); return MStatus::kSuccess; }; + +static float demoRot = 0.0f; + MStatus mtco_MayaRenderer::translateMesh(const MUuid& id, const MObject& node) { - MGlobal::displayInfo("translateMesh"); + Logging::debug("translateMesh"); + + Corona::IGeometryGroup *group = nullptr; + // remove geogroup if it exists + for (auto& gg : geometryGroupArray) + { + if (gg.id == id) + { + Logging::debug(MString("Found existing geometry group for mesh ") + getObjectName(node)); + context->scene->deleteGeomGroup(gg.geoGrp); + gg.geoGrp = context->scene->addGeomGroup(); + group = gg.geoGrp; + } + } + + // if we do not have an entry, create a new one + if (group == nullptr) + { + Logging::debug(MString("Found no existing geometry group for mesh ") + getObjectName(node) + " creating new one."); + GeoGroupStruct gg; + gg.geoGrp = context->scene->addGeomGroup(); + gg.mobject = node; + gg.id = id; + geometryGroupArray.push_back(gg); + group = gg.geoGrp; + } + + Logging::debug(MString("Scene has ") + context->scene->numGeomGroups() + " geometry groups."); + + //Corona::SphereData sphere; + //sphere.materialId = 0; + //group->addPrimitive(sphere); + defineMesh(group, node); + IdNameStruct idn; + idn.id = id; + idn.mobject = node; + idn.name = "mesh"; + objectArray.push_back(idn); + lastShape = node; + return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::translateLightSource(const MUuid& id, const MObject& node) { - MGlobal::displayInfo("translateLightSource"); + Logging::debug("translateLightSource"); + + Corona::IGeometryGroup *group = nullptr; + for (auto gg : geometryGroupArray) + { + if (gg.mobject == node) + { + Logging::debug(MString("Found existing geometry group for mesh ") + getObjectName(node)); + context->scene->deleteGeomGroup(gg.geoGrp); + gg.geoGrp = context->scene->addGeomGroup(); + group = gg.geoGrp; + } + } + if (group == nullptr) + { + GeoGroupStruct gg; + gg.geoGrp = context->scene->addGeomGroup(); + gg.mobject = node; + geometryGroupArray.push_back(gg); + group = gg.geoGrp; + } + + defineStdPlane(group); + IdNameStruct idn; + idn.id = id; + idn.mobject = node; + idn.name = "light"; + objectArray.push_back(idn); + lastShape = node; + return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::translateCamera(const MUuid& id, const MObject& node) { - MGlobal::displayInfo("translateCamera"); + Logging::debug("translateCamera"); + IdNameStruct idn; + idn.id = id; + idn.mobject = node; + idn.name = "camera"; + objectArray.push_back(idn); + lastShape = node; return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::translateEnvironment(const MUuid& id, EnvironmentType type) { - MGlobal::displayInfo("translateEnvironment"); + Logging::debug("translateEnvironment"); + IdNameStruct idn; + idn.id = id; + idn.name = "environment"; + objectArray.push_back(idn); + lastShape = MObject::kNullObj; return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::translateTransform(const MUuid& id, const MUuid& childId, const MMatrix& matrix) { - MGlobal::displayInfo("translateTransform"); + Logging::debug("translateTransform"); + IdNameStruct ids; + Corona::AnimatedAffineTm atm; + MMatrix m = matrix; + setAnimatedTransformationMatrix(atm, m); + + for (auto idn : objectArray) + { + //Logging::debug(MString("Searching id in obj array: idn.id ") + idn.id + " id " + id + " childId " + childId); + if (idn.mobject == lastShape) + { + Logging::debug(MString("Found id for obj ") + idn.name); + if (idn.mobject.hasFn(MFn::kCamera)) + { + Logging::debug(MString("Camera Transform")); + Corona::CameraData& camera = this->context->scene->getCamera(); + float deviceAspect = width / height; + updateCamera(camera, idn.mobject, matrix, deviceAspect); + } + if (idn.mobject.hasFn(MFn::kMesh)) + { + Logging::debug(MString("Mesh Transform")); + for (auto& gg : geometryGroupArray) + { + if (gg.mobject == lastShape) + { + // let's see if we have a predfined shader + Corona::SharedPtr mat; + for (auto sidn : objectArray) + { + if (sidn.name == "coronaMaterial") + { + if (sidn.id == id) + { + mat = sidn.material; + } + } + } + + gg.geoGrp->deleteAllInstances(); + + Corona::NativeMtlData data; + data.components.diffuse.setColor(Corona::Rgb(FLT_RAND(), FLT_RAND(), FLT_RAND())); + if (mat.getReference() == nullptr) + mat = data.createMaterial(); + Corona::IMaterialSet ms = Corona::IMaterialSet(mat); + gg.instance = gg.geoGrp->addInstance(atm, nullptr, nullptr); + gg.instance->addMaterial(ms); + Logging::debug(MString("Mesh has ") + gg.geoGrp->numInstances() + " instances"); + ids.mobject = gg.mobject; + lastShape = MObject::kNullObj; + } + } + } + + if (idn.mobject.hasFn(MFn::kAreaLight)) + { + Logging::debug(MString("Area Light Transform")); + Corona::NativeMtlData data; + MFnDependencyNode depFn(idn.mobject); + MColor lightColor = getColorAttr("color", depFn); + float intensity = getFloatAttr("intensity", depFn, 1.0f); + lightColor *= intensity; + data.emission.color.setColor(Corona::Rgb(lightColor.r, lightColor.g, lightColor.b )); + data.castsShadows = false; // a light should never cast shadows + data.emission.disableSampling = false; + Corona::SharedPtr mat = data.createMaterial(); + Corona::IMaterialSet ms = Corona::IMaterialSet(mat); + + Corona::IGeometryGroup *group = nullptr; + GeoGroupStruct *gg = nullptr; + + for (uint i = 0; i < geometryGroupArray.size(); i++) + { + gg = &geometryGroupArray[i]; + if (gg->mobject == idn.mobject) + { + Logging::debug(MString("Found existing geometry group for areaLight transform translation ")); + group = gg->geoGrp; + } + } + if (group != nullptr) + { + gg->instance = group->addInstance(atm, nullptr, nullptr); + gg->instance->addMaterial(ms); + } + + } + } + } + ids.id = id; + ids.name = "transform"; + objectArray.push_back(ids); + + ids.id = childId; + ids.name = "transformChild"; + objectArray.push_back(ids); + return MStatus::kSuccess; + return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::translateShader(const MUuid& id, const MObject& node) { - MGlobal::displayInfo(MString("translateShader: ")); + Logging::debug(MString("translateShader: ")); + IdNameStruct idn; + idn.id = id; + idn.name = "material"; + idn.mobject = node; + objectArray.push_back(idn); + lastShape = node; return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::setProperty(const MUuid& id, const MString& name, bool value) { - MGlobal::displayInfo(MString("setProperty bool: ") + name + " " + value); + Logging::debug(MString("setProperty bool: ") + name + " " + value); return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::setProperty(const MUuid& id, const MString& name, int value) { - MGlobal::displayInfo(MString("setProperty int: ") + name + " " + value); + Logging::debug(MString("setProperty int: ") + name + " " + value); return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::setProperty(const MUuid& id, const MString& name, float value) { - MGlobal::displayInfo(MString("setProperty float: ") + name + " " + value); + Logging::debug(MString("setProperty float: ") + name + " " + value); return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::setProperty(const MUuid& id, const MString& name, const MString& value) { - MGlobal::displayInfo(MString("setProperty string: ") + name + " " + value); + mtco_FileLoader fl; + Logging::debug(MString("setProperty string: ") + name + " " + value); + + MString mayaRoot = getenv("MAYA_LOCATION"); + MString blackImage = mayaRoot + "/presets/Assets/IBL/black.exr"; + + IdNameStruct idNameObj; + for (auto idobj : objectArray) + { + if (idobj.id == id) + { + Logging::debug(MString("Found id object for string property: ") + idobj.name); + if (idobj.name == "environment") + { + if (name == "imageFile") + { + Logging::debug(MString("Setting environment image file to: ") + value); + Corona::SharedPtr texmap; + if (value.length() == 0) + texmap = fl.loadBitmap(blackImage.asChar()); + else + texmap = fl.loadBitmap(value.asChar()); + context->scene->setBackground(Corona::ColorOrMap(0.0f, texmap)); + } + } + } + } + return MStatus::kSuccess; }; MStatus mtco_MayaRenderer::setShader(const MUuid& id, const MUuid& shaderId) { - MGlobal::displayInfo("setShader"); + Logging::debug("setShader"); + IdNameStruct idnShader; + MObject meshObject; + + // first find the shader node + for (uint i = 0; i < objectArray.size(); i++) + { + if (objectArray[i].id == shaderId) + { + idnShader = objectArray[i]; + break; + } + } + + IdNameStruct idnGeo; + for (uint i = 0; i < objectArray.size(); i++) + { + if (objectArray[i].id == id) + { + idnGeo = objectArray[i]; + break; + } + } + + if ((idnShader.mobject == MObject::kNullObj) || (idnGeo.mobject == MObject::kNullObj)) + { + Logging::debug(MString("Object not fund for shader update.")); + return MS::kFailure; + } + + Corona::IGeometryGroup *group = nullptr; + GeoGroupStruct *gg = nullptr; + + for (uint i = 0; i < geometryGroupArray.size(); i++) + { + gg = &geometryGroupArray[i]; + if (gg->mobject == idnGeo.mobject) + { + Logging::debug(MString("Found existing geometry group for shader update ")); + break; + } + } + + if ( gg == nullptr) + { + Logging::debug(MString("Geo Group not fund for shader update.")); + return MS::kFailure; + } + + gg->instance->clearMaterials(); + Corona::SharedPtr mat = defineCoronaMaterial(idnShader.mobject, nullptr, oslRenderer); + + + // first find the shader node + bool alreadyExists = false; + for (uint i = 0; i < objectArray.size(); i++) + { + if (objectArray[i].id == id) + { + if (objectArray[i].name == "coronaMaterial") + { + objectArray[i].material = mat; + alreadyExists = true; + break; + } + } + } + if (!alreadyExists) + { + IdNameStruct idn; + idn.id = id; + idn.name = "coronaMaterial"; + idn.mobject = idnGeo.mobject; + idn.material = mat; + objectArray.push_back(idn); + } + Corona::IMaterialSet ms = Corona::IMaterialSet(mat); + gg->instance->addMaterial(ms); return MStatus::kSuccess; }; + MStatus mtco_MayaRenderer::setResolution(unsigned int w, unsigned int h) { - MGlobal::displayInfo("setResolution"); + Logging::debug(MString("setResolution ") + w + " " + h); this->width = w; this->height = h; - // Update resolution buffer this->renderBuffer = (float*)realloc(this->renderBuffer, w*h*kNumChannels*sizeof(float)); - return MStatus::kSuccess; -}; -MStatus mtco_MayaRenderer::endSceneUpdate() -{ - MGlobal::displayInfo("endSceneUpdate"); - - if (mtco_MayaRenderer::running) - render(); + if (good) + { + context->settings->set(Corona::PARAM_IMAGE_WIDTH, width); + context->settings->set(Corona::PARAM_IMAGE_HEIGHT, height); + context->core->destroyFb(context->fb); + context->fb = context->core->createFb(); + context->fb->initFb(context->settings, context->renderPasses); + } return MStatus::kSuccess; }; + MStatus mtco_MayaRenderer::destroyScene() { - MGlobal::displayInfo("destroyScene"); + Logging::debug("destroyScene"); + finishRendering(); + ProgressParams progressParams; + progressParams.progress = -1.0f; + progress(progressParams); + objectArray.clear(); + for (auto& gg : geometryGroupArray) + { + context->scene->deleteGeomGroup(gg.geoGrp); + } + geometryGroupArray.clear(); return MStatus::kSuccess; }; bool mtco_MayaRenderer::isSafeToUnload() { - MGlobal::displayInfo("isSafeToUnload"); + Logging::debug("isSafeToUnload"); return true; }; + +void mtco_MayaRenderer::framebufferCallback() +{ + Logging::debug("framebufferCallback"); + + Corona::Pixel p = context->fb->getImageSize(); + if ((p.x != width) || (p.y != height)) + { + Logging::error("ImageSize is different"); + return; + } + + size_t numPixels = width * height; + uint numPixelsInRow = width; + bool doToneMapping = false; + Corona::Pixel firstPixelInRow(0, 0); + Corona::Rgb *outColors = new Corona::Rgb[numPixelsInRow]; + float *outAlpha = new float[numPixelsInRow]; + for (uint rowId = 0; rowId < p.y; rowId++) + { + memset(outAlpha, 0, numPixelsInRow * sizeof(float)); + firstPixelInRow.y = rowId; + try{ + context->fb->getRow(firstPixelInRow, numPixelsInRow, Corona::CHANNEL_BEAUTY, doToneMapping, false, outColors, outAlpha); + } + catch (char *errorMsg){ + Logging::error(errorMsg); + break; + } + uint rowPos = (height - 1 - rowId) * numPixelsInRow; + for (int x = 0; x < numPixelsInRow; x++) + { + int index = (rowPos + x) * kNumChannels; + *(renderBuffer + index) = outColors[x].r(); + *(renderBuffer + index + 1) = outColors[x].g(); + *(renderBuffer + index + 2) = outColors[x].b(); + *(renderBuffer + index + 3) = 1.0f; + } + } + delete[] outColors; + delete[] outAlpha; + + refreshParams.bottom = 0; + refreshParams.top = height - 1; + refreshParams.bytesPerChannel = sizeof(float); + refreshParams.channels = kNumChannels; + refreshParams.left = 0; + refreshParams.right = width - 1; + refreshParams.width = width; + refreshParams.height = height; + refreshParams.data = renderBuffer; + refresh(refreshParams); +} #endif diff --git a/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.h b/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.h index a322a86..436ba7d 100644 --- a/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.h +++ b/src/mayaToCorona/src/mtco_common/mtco_mayaRenderer.h @@ -1,22 +1,60 @@ #ifndef MAYA_RENDERER_H #define MAYA_RENDERER_H +#include #if MAYA_API_VERSION >= 201600 +#include "../coronaOSL/oslRenderer.h" #include "CoronaCore/api/Api.h" #include #include +#include +#include #include +// ------------------- TESTING ---------------------- +void createSceneMini(Corona::IScene* scene); +// advanced example - custom light shader +class MyLight : public Corona::Abstract::LightShader, public Corona::Noncopyable { +public: + + const Corona::Pos LIGHT_POS; + const Corona::Dir LIGHT_DIR; + + MyLight() : LIGHT_POS(Corona::Pos(-3, -3, -7)), LIGHT_DIR(Corona::Dir(1, 1, -1.f).getNormalized()) { } + + // simulate spot light with colorful directional falloff + virtual Corona::BsdfComponents getIllumination(Corona::IShadeContext& context, Corona::Spectrum& transport) const { + const Corona::Pos surface = context.getPosition(); + float distance; + const Corona::Dir toLight = (LIGHT_POS - surface).getNormalized(distance); // direction + distance to light + + const float cosAngle = Corona::Utils::max(0.f, -dot(toLight, LIGHT_DIR)); + // calculate the light emission: divide by d^2 to get physical attenuation + const Corona::Spectrum emitted = 50 * cosAngle* Corona::Spectrum::max(Corona::Spectrum::BLACK, Corona::Spectrum(cosAngle * 2 - 1, 1 - 2 * abs(cosAngle - 0.5f), (1 - cosAngle) * 2 - 1)) / (distance*distance); + + // shadow transmission, including occlusion effects + transport = context.shadowTransmission(LIGHT_POS, Corona::RAY_NORMAL); + float dummy; + + // bsdf value: amount of light incident from light reflected to camera/previous point + Corona::BsdfComponents brdf; + context.forwardBsdfCos(toLight, brdf, dummy); + return brdf * (Corona::PI*emitted); + } +}; +// ------------------- TESTING ---------------------- + + class mtco_Logger : public Corona::Abstract::Logger { public: mtco_Logger(Corona::ICore* core) : Corona::Abstract::Logger(&core->getStats()) { }; - virtual void logMsg(const Corona::String& message, const Corona::LogType type) + virtual void logMsg(const Corona::String& message, const Corona::LogType type, const int errorCategory = 0) { std::cout << message << std::endl; } @@ -65,13 +103,31 @@ class Settings : public Corona::Abstract::Settings { } }; +struct IdNameStruct{ + MUuid id; + MString name; // in appleseed objects must have unique names + MObject mobject; // I need to know if I have a light or a mesh or a camera + Corona::SharedPtr material; +}; + +struct GeoGroupStruct{ + Corona::IGeometryGroup *geoGrp = nullptr; + MObject mobject; + Corona::IInstance *instance = nullptr; + MUuid id; +}; + class mtco_MayaRenderer : public MPxRenderer { public: RefreshParams refreshParams; - static bool running; - + int initialSize = 256; + bool good = false; + bool isRendering = false; + bool completlyInitialized = false; mtco_MayaRenderer(); + virtual ~mtco_MayaRenderer(); + static void* creator(); virtual MStatus startAsync(const JobParams& params); virtual MStatus stopAsync(); @@ -101,11 +157,20 @@ class mtco_MayaRenderer : public MPxRenderer virtual bool isSafeToUnload(); void render(); - + void framebufferCallback(); + void finishRendering(); + Context *context; + int refreshInteraval = 1; private: + OSL::OSLShadingNetworkRenderer *oslRenderer = new OSL::OSLShadingNetworkRenderer; + int width, height; - //Render output buffer, it is R32G32B32A32_FLOAT format. + std::thread renderThread; + std::thread fbThread; float* renderBuffer; + MObject lastShape = MObject::kNullObj; + std::vector objectArray; + std::vector geometryGroupArray; }; #endif diff --git a/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.cpp b/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.cpp index c6f0dc2..9a4abe0 100644 --- a/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.cpp +++ b/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.cpp @@ -13,6 +13,8 @@ static Logging logger; static bool done; +static OSL::OSLShadingNetworkRenderer *oslRenderer = new OSL::OSLShadingNetworkRenderer; + mtco_SwatchRendererInterface::mtco_SwatchRendererInterface(MObject dependNode, MObject renderNode, int imageResolution) { #ifdef _DEBUG @@ -125,6 +127,7 @@ void mtco_SwatchRendererInterface::renderSwatch() { return; } + oslRenderer->setup(); Context *c = new Context(); this->inProgress = true; @@ -140,7 +143,7 @@ void mtco_SwatchRendererInterface::renderSwatch() config.lightsSize = 1.0f; config.lightsIntensity = 1.0f; - Corona::SharedPtr mat = defineCoronaMaterial(dependNode); + Corona::SharedPtr mat = defineCoronaMaterial(dependNode, nullptr, oslRenderer); Corona::IMaterialSet ms = Corona::IMaterialSet(mat); config.materials.push(ms); c->core->setupMtlPreviewScene(config, c->scene, c->settings); @@ -191,4 +194,4 @@ void mtco_SwatchRendererInterface::initializeStaticData() void mtco_SwatchRendererInterface::cleanUpStaticData() { -} \ No newline at end of file +} diff --git a/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.h b/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.h index d971e79..c303295 100644 --- a/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.h +++ b/src/mayaToCorona/src/mtco_common/mtco_swatchRenderer.h @@ -4,6 +4,7 @@ #include #include "swatchesRenderer/SwatchRendererInterface.h" #include +#include "../coronaOSL/oslRenderer.h" #include "CoronaCore/api/Api.h" @@ -66,7 +67,7 @@ class mtco_Logger : public Corona::Abstract::Logger mtco_Logger(Corona::ICore* core) : Corona::Abstract::Logger(&core->getStats()) { }; - virtual void logMsg(const Corona::String& message, const Corona::LogType type) + virtual void logMsg(const Corona::String& message, Corona::LogType logType, const int errorCategory) { std::cout << message << std::endl; } @@ -120,7 +121,7 @@ class mtco_SwatchRendererInterface : SwatchRendererInterface { public: mtco_SwatchRendererInterface(MObject dependNode, MObject renderNode, int imageResolution); - ~mtco_SwatchRendererInterface(); + virtual ~mtco_SwatchRendererInterface(); MObject renderNode; MObject dependNode; @@ -133,7 +134,6 @@ class mtco_SwatchRendererInterface : SwatchRendererInterface virtual void fillDummySwatch(MImage& image); // corona specific - Corona::ICore::MtlSceneConfig config; //Context context; void defineSettings(); diff --git a/src/mayaToCorona/src/pluginMain.cpp b/src/mayaToCorona/src/pluginMain.cpp index 1cf8283..5a46aa3 100644 --- a/src/mayaToCorona/src/pluginMain.cpp +++ b/src/mayaToCorona/src/pluginMain.cpp @@ -6,12 +6,15 @@ #include #include -#include "CoronaCore/api/Api.h" +#include "coronaOSL/oslRenderer.h" // this is only needed to make correct include order. Otherwise I get a isnan error + #include "mayatoCorona.h" #include "mtco_common/mtco_renderGlobalsNode.h" #include "utilities/tools.h" #include "utilities/logging.h" +#include "CoronaCore/api/Api.h" + #include "threads/renderQueueWorker.h" #include "swatchesRenderer\swatchRenderer.h" @@ -25,19 +28,19 @@ #include "shaders/coronaOSLNode.h" #include "shaders/coronaLayeredMaterial.h" #include "shaders/coronaAO.h" -#include "shaders/coronaFrontBack.h" +#include "shaders/coronaFrontBackShader.h" #include "shaders/coronaSkyShader.h" -#include "shaders/coronaWire.h" +#include "shaders/coronaWireShader.h" #include "shaders/TestShader.h" #include "world.h" #include "Version.h" + #if MAYA_API_VERSION >= 201600 #include "mtco_common/mtco_mayaRenderer.h" #endif - //#include "rvCmd.h" static const MString swatchName("CoronaRenderSwatch"); @@ -80,6 +83,10 @@ static bool licenseChecked = false; MStatus initializePlugin( MObject obj ) { +#ifdef _DEBUG + Logging::setLogLevel(Logging::Debug); +#endif + std::vector versionStrings = getFullVersionString(); MGlobal::displayInfo(MString("MayaToCorona version: ") + versionStrings[0].c_str()); MGlobal::displayInfo(MString("Corona Core: ") + +versionStrings[1].c_str()); @@ -110,7 +117,6 @@ MStatus initializePlugin( MObject obj ) CHECK_MSTATUS(plugin.registerNode("TestShader", TestShader::id, TestShader::creator, TestShader::initialize, MPxNode::kDependNode, &TestShaderClassification)); - status = plugin.registerCommand(MAYATOCMDNAME, MayaToCorona::creator, MayaToCorona::newSyntax ); if (!status) { status.perror("cannot register command: mayatoCorona"); @@ -151,14 +157,6 @@ MStatus initializePlugin( MObject obj ) return status; } -#if MAYA_API_VERSION >= 201600 - status = plugin.registerRenderer("Corona", mtco_MayaRenderer::creator); - if (!status) { - status.perror("cannot register node: Corona Maya renderer"); - return status; - } -#endif - Corona::ICore::initLib(Corona::APP_MAYA); if (!licenseChecked) { @@ -173,6 +171,16 @@ MStatus initializePlugin( MObject obj ) } } +// register material editor renderer after license check because as soon as it is registered, +// the node is created and needs a license +#if MAYA_API_VERSION >= 201600 + status = plugin.registerRenderer("Corona", mtco_MayaRenderer::creator); + if (!status) { + status.perror("cannot register node: Corona Maya renderer"); + return status; + } +#endif + MayaTo::defineWorld(); MString loadPath = plugin.loadPath(); MayaTo::getWorldPtr()->shaderSearchPath.append(loadPath); diff --git a/src/mayaToCorona/src/shaders/coronaAO.cpp b/src/mayaToCorona/src/shaders/coronaAO.cpp index 1da8f49..a847d94 100644 --- a/src/mayaToCorona/src/shaders/coronaAO.cpp +++ b/src/mayaToCorona/src/shaders/coronaAO.cpp @@ -107,7 +107,7 @@ MStatus CoronaAO::initialize() CHECK_MSTATUS(addAttribute(offsetY)); MObject offsetZ = nAttr.create("offsetZ", "offsetZ", MFnNumericData::kFloat, 0.0); CHECK_MSTATUS(addAttribute(offsetZ)); - MObject offset = nAttr.create("offsetZ", "offsetZ", offsetX, offsetY, offsetZ); + offset = nAttr.create("offset", "offset", offsetX, offsetY, offsetZ); useOffset = nAttr.create("useOffset", "useOffset", MFnNumericData::kBoolean, false); CHECK_MSTATUS(addAttribute(useOffset)); diff --git a/src/mayaToCorona/src/shaders/coronaFrontBack.cpp b/src/mayaToCorona/src/shaders/coronaFrontBackShader.cpp similarity index 62% rename from src/mayaToCorona/src/shaders/coronaFrontBack.cpp rename to src/mayaToCorona/src/shaders/coronaFrontBackShader.cpp index 6bc6b15..a7eddd8 100644 --- a/src/mayaToCorona/src/shaders/coronaFrontBack.cpp +++ b/src/mayaToCorona/src/shaders/coronaFrontBackShader.cpp @@ -1,4 +1,4 @@ -#include "coronaFrontBack.h" +#include "coronaFrontBackShader.h" #include #include @@ -19,6 +19,10 @@ MTypeId CoronaFrontBack::id(0x0011CF47); +MObject CoronaFrontBack::frontMaterial; +MObject CoronaFrontBack::backMaterial; +MObject CoronaFrontBack::outColor; + void CoronaFrontBack::postConstructor( ) { MStatus stat; @@ -44,7 +48,21 @@ MStatus CoronaFrontBack::initialize() MFnEnumAttribute eAttr; MFnMessageAttribute mAttr; - MStatus status; + frontMaterial = nAttr.createColor("frontMaterial", "frontMaterial"); + CHECK_MSTATUS(addAttribute(frontMaterial)); + + backMaterial = nAttr.createColor("backMaterial", "backMaterial"); + CHECK_MSTATUS(addAttribute(backMaterial)); + + outColor = nAttr.createColor("outColor", "outColor"); + nAttr.setKeyable(false); + nAttr.setStorable(false); + nAttr.setReadable(true); + nAttr.setWritable(false); + CHECK_MSTATUS(addAttribute(outColor)); + + CHECK_MSTATUS(attributeAffects(frontMaterial, outColor)); + CHECK_MSTATUS(attributeAffects(backMaterial, outColor)); return( MS::kSuccess ); } diff --git a/src/mayaToCorona/src/shaders/coronaFrontBack.h b/src/mayaToCorona/src/shaders/coronaFrontBackShader.h similarity index 81% rename from src/mayaToCorona/src/shaders/coronaFrontBack.h rename to src/mayaToCorona/src/shaders/coronaFrontBackShader.h index 807e7a7..cbcdaae 100644 --- a/src/mayaToCorona/src/shaders/coronaFrontBack.h +++ b/src/mayaToCorona/src/shaders/coronaFrontBackShader.h @@ -15,6 +15,10 @@ class CoronaFrontBack : public MPxNode static MTypeId id; + static MObject frontMaterial; + static MObject backMaterial; + static MObject outColor; + protected: }; diff --git a/src/mayaToCorona/src/shaders/coronaSkyShader.cpp b/src/mayaToCorona/src/shaders/coronaSkyShader.cpp index 08eb44e..0acc009 100644 --- a/src/mayaToCorona/src/shaders/coronaSkyShader.cpp +++ b/src/mayaToCorona/src/shaders/coronaSkyShader.cpp @@ -19,6 +19,21 @@ MTypeId CoronaSkyShader::id(0x0011CF46); +MObject CoronaSkyShader::pSkyModel; +MObject CoronaSkyShader::pSkyMultiplier; +MObject CoronaSkyShader::pSkyHorizBlur; +MObject CoronaSkyShader::pSkyGroundColor; +MObject CoronaSkyShader::pSkyAffectGround; +MObject CoronaSkyShader::pSkyPreethamTurb; +MObject CoronaSkyShader::pSkySunFalloff; +MObject CoronaSkyShader::pSkyZenith; +MObject CoronaSkyShader::pSkyHorizon; +MObject CoronaSkyShader::pSkySunGlow; +MObject CoronaSkyShader::pSkySunSideGlow; +MObject CoronaSkyShader::pSkySunBleed; +MObject CoronaSkyShader::sunSizeMulti; +MObject CoronaSkyShader::outColor; + void CoronaSkyShader::postConstructor( ) { MStatus stat; @@ -44,7 +59,88 @@ MStatus CoronaSkyShader::initialize() MFnEnumAttribute eAttr; MFnMessageAttribute mAttr; - MStatus status; + MStatus stat; + + pSkyModel = eAttr.create("pSkyModel", "pSkyModel", 2, &stat); + stat = eAttr.addField("Preetham", 0); + stat = eAttr.addField("Rawafake", 1); + stat = eAttr.addField("Hosek", 2); + CHECK_MSTATUS(addAttribute(pSkyModel)); + + pSkyMultiplier = nAttr.create("pSkyMultiplier", "pSkyMultiplier", MFnNumericData::kFloat, 1.0); + nAttr.setMin(0.0001f); + nAttr.setSoftMax(1.0f); + CHECK_MSTATUS(addAttribute(pSkyMultiplier)); + + pSkyHorizBlur = nAttr.create("pSkyHorizBlur", "pSkyHorizBlur", MFnNumericData::kFloat, 0.1); + nAttr.setMin(0.0f); + nAttr.setMax(1.0f); + CHECK_MSTATUS(addAttribute(pSkyHorizBlur)); + + pSkyGroundColor = nAttr.createColor("pSkyGroundColor", "pSkyGroundColor"); + nAttr.setDefault(0.25, 0.25, 0.25); + CHECK_MSTATUS(addAttribute(pSkyGroundColor)); + + pSkyAffectGround = nAttr.create("pSkyAffectGround", "pSkyAffectGround", MFnNumericData::kBoolean, true); + CHECK_MSTATUS(addAttribute(pSkyAffectGround)); + + pSkyPreethamTurb = nAttr.create("pSkyPreethamTurb", "pSkyPreethamTurb", MFnNumericData::kFloat, 2.5); + nAttr.setMin(1.7f); + nAttr.setMax(10.0f); + CHECK_MSTATUS(addAttribute(pSkyPreethamTurb)); + + pSkySunFalloff = nAttr.create("pSkySunFalloff", "pSkySunFalloff", MFnNumericData::kFloat, 3.0); + nAttr.setMin(0.0001f); + nAttr.setSoftMax(10.0f); + CHECK_MSTATUS(addAttribute(pSkySunFalloff)); + + pSkyZenith = nAttr.createColor("pSkyZenith", "pSkyZenith"); + nAttr.setDefault(0.1, 0.1, 0.5); + CHECK_MSTATUS(addAttribute(pSkyZenith)); + + pSkyHorizon = nAttr.createColor("pSkyHorizon", "pSkyHorizon"); + nAttr.setDefault(0.25, 0.5, 0.5); + CHECK_MSTATUS(addAttribute(pSkyHorizon)); + + pSkySunGlow = nAttr.create("pSkySunGlow", "pSkySunGlow", MFnNumericData::kFloat, 1.0); + nAttr.setMin(0.0f); + nAttr.setMax(1.0f); + CHECK_MSTATUS(addAttribute(pSkySunGlow)); + + pSkySunSideGlow = nAttr.create("pSkySunSideGlow", "pSkySunSideGlow", MFnNumericData::kFloat, 0.2); + nAttr.setMin(0.0f); + nAttr.setMax(1.0f); + CHECK_MSTATUS(addAttribute(pSkySunSideGlow)); + + pSkySunBleed = nAttr.create("pSkySunBleed", "pSkySunBleed", MFnNumericData::kFloat, 1.0); + nAttr.setMin(0.0f); + nAttr.setMax(1.0f); + CHECK_MSTATUS(addAttribute(pSkySunBleed)); + + sunSizeMulti = nAttr.create("sunSizeMulti", "sunSizeMulti", MFnNumericData::kFloat, 1.0); + nAttr.setMin(0.1); + nAttr.setSoftMax(64.0); + CHECK_MSTATUS(addAttribute(sunSizeMulti)); + + outColor = nAttr.createColor("outColor", "outColor"); + nAttr.setKeyable(false); + nAttr.setStorable(false); + nAttr.setReadable(true); + nAttr.setWritable(false); + CHECK_MSTATUS(addAttribute(outColor)); + + CHECK_MSTATUS(attributeAffects(pSkyMultiplier, outColor)); + CHECK_MSTATUS(attributeAffects(pSkyHorizBlur, outColor)); + CHECK_MSTATUS(attributeAffects(pSkyGroundColor, outColor)); + CHECK_MSTATUS(attributeAffects(pSkyAffectGround, outColor)); + CHECK_MSTATUS(attributeAffects(pSkyPreethamTurb, outColor)); + CHECK_MSTATUS(attributeAffects(pSkySunFalloff, outColor)); + CHECK_MSTATUS(attributeAffects(pSkyZenith, outColor)); + CHECK_MSTATUS(attributeAffects(pSkyHorizon, outColor)); + CHECK_MSTATUS(attributeAffects(pSkySunGlow, outColor)); + CHECK_MSTATUS(attributeAffects(pSkySunBleed, outColor)); + CHECK_MSTATUS(attributeAffects(sunSizeMulti, outColor)); + return( MS::kSuccess ); } diff --git a/src/mayaToCorona/src/shaders/coronaSkyShader.h b/src/mayaToCorona/src/shaders/coronaSkyShader.h index 8468738..f6b11e6 100644 --- a/src/mayaToCorona/src/shaders/coronaSkyShader.h +++ b/src/mayaToCorona/src/shaders/coronaSkyShader.h @@ -15,6 +15,20 @@ class CoronaSkyShader : public MPxNode static MTypeId id; -protected: + static MObject pSkyModel; + static MObject pSkyMultiplier; + static MObject pSkyHorizBlur; + static MObject pSkyGroundColor; + static MObject pSkyAffectGround; + static MObject pSkyPreethamTurb; + static MObject pSkySunFalloff; + static MObject pSkyZenith; + static MObject pSkyHorizon; + static MObject pSkySunGlow; + static MObject pSkySunSideGlow; + static MObject pSkySunBleed; + static MObject sunSizeMulti; + + static MObject outColor; }; diff --git a/src/mayaToCorona/src/shaders/coronaWire.cpp b/src/mayaToCorona/src/shaders/coronaWire.cpp deleted file mode 100644 index 79686ce..0000000 --- a/src/mayaToCorona/src/shaders/coronaWire.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "coronaWire.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -MTypeId CoronaWire::id(0x0011CF45); - -void CoronaWire::postConstructor( ) -{ - MStatus stat; - setMPSafe( true ); - this->setExistWithoutInConnections(true); -} - -CoronaWire::CoronaWire() { } -CoronaWire::~CoronaWire() { } - - -void* CoronaWire::creator() -{ - return new CoronaWire(); -} - -MStatus CoronaWire::initialize() -{ - MFnNumericAttribute nAttr; - MFnLightDataAttribute lAttr; - MFnTypedAttribute tAttr; - MFnGenericAttribute gAttr; - MFnEnumAttribute eAttr; - MFnMessageAttribute mAttr; - - MStatus status; - return( MS::kSuccess ); -} - -MStatus CoronaWire::compute( const MPlug& plug, MDataBlock& block ) -{ - return( MS::kSuccess ); -} - - diff --git a/src/mayaToCorona/src/shaders/coronaWire.h b/src/mayaToCorona/src/shaders/coronaWire.h deleted file mode 100644 index b3d7dfa..0000000 --- a/src/mayaToCorona/src/shaders/coronaWire.h +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -// Plugin CoronaWire Shader Class // - -class CoronaWire : public MPxNode -{ -public: - CoronaWire(); - virtual ~CoronaWire(); - - static void * creator(); - virtual MStatus compute( const MPlug&, MDataBlock& ); - static MStatus initialize(); - - virtual void postConstructor(); - - static MTypeId id; - -protected: - -}; diff --git a/src/mayaToCorona/src/shaders/coronaWireShader.cpp b/src/mayaToCorona/src/shaders/coronaWireShader.cpp new file mode 100644 index 0000000..b1464d2 --- /dev/null +++ b/src/mayaToCorona/src/shaders/coronaWireShader.cpp @@ -0,0 +1,91 @@ +#include "coronaWireShader.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MTypeId CoronaWire::id(0x0011CF45); + +MObject CoronaWire::useWorldSpace; +MObject CoronaWire::showVertices; +MObject CoronaWire::showEdges; +MObject CoronaWire::allEdges; +MObject CoronaWire::edgeWidth; +MObject CoronaWire::vertexWidth; +MObject CoronaWire::outColor; + +void CoronaWire::postConstructor( ) +{ + MStatus stat; + setMPSafe( true ); + this->setExistWithoutInConnections(true); +} + +CoronaWire::CoronaWire() { } +CoronaWire::~CoronaWire() { } + + +void* CoronaWire::creator() +{ + return new CoronaWire(); +} + +MStatus CoronaWire::initialize() +{ + MFnNumericAttribute nAttr; + MFnLightDataAttribute lAttr; + MFnTypedAttribute tAttr; + MFnGenericAttribute gAttr; + MFnEnumAttribute eAttr; + MFnMessageAttribute mAttr; + MStatus status; + + useWorldSpace = nAttr.create("useWorldSpace", "useWorldSpace", MFnNumericData::kBoolean, false); + CHECK_MSTATUS(addAttribute(useWorldSpace)); + + showVertices = nAttr.create("showVertices", "showVertices", MFnNumericData::kBoolean, false); + CHECK_MSTATUS(addAttribute(showVertices)); + + showEdges = nAttr.create("showEdges", "showEdges", MFnNumericData::kBoolean, false); + CHECK_MSTATUS(addAttribute(showEdges)); + + allEdges = nAttr.create("allEdges", "allEdges", MFnNumericData::kBoolean, true); + CHECK_MSTATUS(addAttribute(allEdges)); + + edgeWidth = nAttr.create("edgeWidth", "edgeWidth", MFnNumericData::kFloat, 1.0); + CHECK_MSTATUS(addAttribute(edgeWidth)); + + vertexWidth = nAttr.create("vertexWidth", "vertexWidth", MFnNumericData::kFloat, 1.0); + CHECK_MSTATUS(addAttribute(vertexWidth)); + + outColor = nAttr.createColor("outColor", "outColor"); + nAttr.setKeyable(false); + nAttr.setStorable(false); + nAttr.setReadable(true); + nAttr.setWritable(false); + CHECK_MSTATUS(addAttribute(outColor)); + + CHECK_MSTATUS(attributeAffects(useWorldSpace, outColor)); + + return(MS::kSuccess); +} + +MStatus CoronaWire::compute( const MPlug& plug, MDataBlock& block ) +{ + return( MS::kSuccess ); +} + + diff --git a/src/mayaToCorona/src/shaders/coronaWireShader.h b/src/mayaToCorona/src/shaders/coronaWireShader.h new file mode 100644 index 0000000..b383531 --- /dev/null +++ b/src/mayaToCorona/src/shaders/coronaWireShader.h @@ -0,0 +1,43 @@ +#include +#include + +// Plugin CoronaWire Shader Class // + +class CoronaWire : public MPxNode +{ +public: + CoronaWire(); + virtual ~CoronaWire(); + + static void * creator(); + virtual MStatus compute( const MPlug&, MDataBlock& ); + static MStatus initialize(); + + virtual void postConstructor(); + + static MTypeId id; + + /// If true, then the distance in world space will be used, otherwise, projected distance in pixels is used by edgeWidth and + /// vertexWidth + static MObject useWorldSpace; + + /// Enables showing vertices. Vertices have priority over edges + static MObject showVertices; + + /// Enables showing edges + static MObject showEdges; + + /// Enables showing all triangle edges. When false, only edges that were set to visible in the triangle input data are used + static MObject allEdges; + + /// Width of the edge detection, either in world units, or in projected pixels (see useWorldSpace) + static MObject edgeWidth; + + /// Width of the vertex detection, either in world units, or in projected pixels (see useWorldSpace) + static MObject vertexWidth; + + static MObject outColor; + +protected: + +}; diff --git a/src/mayaToCorona/vs/mayaToCorona.vcxproj b/src/mayaToCorona/vs/mayaToCorona.vcxproj index c3600ea..ce579e0 100644 --- a/src/mayaToCorona/vs/mayaToCorona.vcxproj +++ b/src/mayaToCorona/vs/mayaToCorona.vcxproj @@ -262,6 +262,7 @@ + @@ -282,6 +283,7 @@ false false + false false @@ -318,6 +320,9 @@ false false + + true + false false @@ -343,6 +348,7 @@ false false + false false @@ -360,7 +366,7 @@ - + @@ -371,7 +377,7 @@ - + @@ -412,6 +418,7 @@ + @@ -431,6 +438,9 @@ false + + + false false @@ -447,6 +457,9 @@ false + + true + false false @@ -471,6 +484,7 @@ false + @@ -478,7 +492,7 @@ - + @@ -489,7 +503,7 @@ - + diff --git a/src/mayaToCorona/vs/mayaToCorona.vcxproj.filters b/src/mayaToCorona/vs/mayaToCorona.vcxproj.filters index d9aa00f..378d77f 100644 --- a/src/mayaToCorona/vs/mayaToCorona.vcxproj.filters +++ b/src/mayaToCorona/vs/mayaToCorona.vcxproj.filters @@ -60,6 +60,9 @@ {4d84e593-f220-457a-b1c8-50ab5708b41e} + + {f8bb73f3-3dcf-450d-9607-e99a36f946c0} + @@ -179,9 +182,6 @@ Source Files\shaders - - Source Files\Corona - Source Files\Corona @@ -191,9 +191,6 @@ Source Files\shaders - - Source Files\Corona - Source Files\coronaOSL @@ -248,9 +245,6 @@ Source Files\shaders - - Source Files\Corona - common @@ -290,17 +284,38 @@ Source Files\shaders - + Source Files\shaders - + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + Source Files\shaders - + Source Files\shaders - - Source Files\Corona + + Source Files\Corona\CoronaMaps + + + common\utilities + + + Source Files\Corona\CoronaMaps @@ -397,24 +412,15 @@ Source Files\shaders - - Source Files\Corona - common Source Files\shaders - - Source Files\Corona - Source Files\Corona - - Source Files\Corona - Source Files\coronaOSL @@ -514,18 +520,45 @@ Source Files\shaders - + Source Files\shaders - + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + + Source Files\Corona\CoronaMaps + + Source Files\shaders - + Source Files\shaders - + + Source Files\Corona\CoronaMaps + + + Source Files\Corona + + Source Files\Corona + + common\utilities + + + Source Files\Corona\CoronaMaps +