void vixo_hairStyleMaya::getTextureInfo(MString attrName,vector<float>& uvs,vector<follicleColor>& res,MDataBlock& data) { MPlug plug(thisMObject(),this->densityMap); if(attrName=="tipColor") plug.setAttribute(tipColor); else if(attrName=="baseColor") plug.setAttribute(baseColor); else if(attrName=="tipOpacity") plug.setAttribute(tipOpacity); else if(attrName=="baseOpacity") plug.setAttribute(baseOpacity); MPlugArray arr; plug.connectedTo(arr,true,false); if(arr.length()!=1) { MFloatVector color=data.inputValue(plug).asFloatVector(); if(attrName=="densityMap") for(int i=0;i<uvs.size()/2;i++) res[i].density=color.x; else if(attrName=="tipOpacity") { float noiseAmp=data.inputValue(tipOpacityNoiseAmp).asFloat(); float noiseFreq=data.inputValue(tipOpacityNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { float ton=noise::atPointUV(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq)*2-1; res[i].tipOpa=min(max(color.x+ton*noiseAmp,0.0),1.0); } } else if(attrName=="baseOpacity") { float noiseAmp=data.inputValue(baseOpacityNoiseAmp).asFloat(); float noiseFreq=data.inputValue(baseOpacityNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { float bon=noise::atPointUV(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq)*2-1; res[i].baseOpa=min(max(color.x+bon*noiseAmp,0.0),1.0); } } else if(attrName=="baseColor") { float noiseAmp=data.inputValue(baseColorNoiseAmp).asFloat(); float noiseFreq=data.inputValue(baseColorNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { pnt bcn=noise::atPointUVColor(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq); bcn.x=(bcn.x*2-1)*noiseAmp; bcn.y=(bcn.y*2-1)*noiseAmp; bcn.z=(bcn.z*2-1)*noiseAmp; res[i].baseColorR=min(max(color.x+bcn.x,0.0),1.0); res[i].baseColorG=min(max(color.y+bcn.y,0.0),1.0); res[i].baseColorB=min(max(color.z+bcn.z,0.0),1.0); } } else if(attrName=="tipColor") { float noiseAmp=data.inputValue(tipColorNoiseAmp).asFloat(); float noiseFreq=data.inputValue(tipColorNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { pnt tcn=noise::atPointUVColor(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq); tcn.x=(tcn.x*2-1)*noiseAmp; tcn.y=(tcn.y*2-1)*noiseAmp; tcn.z=(tcn.z*2-1)*noiseAmp; res[i].tipColorR=min(max(color.x+tcn.x,0.0),1.0); res[i].tipColorG=min(max(color.y+tcn.y,0.0),1.0); res[i].tipColorB=min(max(color.z+tcn.z,0.0),1.0); } } return; } MFnDependencyNode dgFn(arr[0].node()); MPlug fnFile=dgFn.findPlug("fileTextureName"); if(fnFile.asString()=="") { MFloatVector color=data.inputValue(plug).asFloatVector(); if(attrName=="densityMap") for(int i=0;i<uvs.size()/2;i++) res[i].density=color.x; else if(attrName=="tipOpacity") { float noiseAmp=data.inputValue(tipOpacityNoiseAmp).asFloat(); float noiseFreq=data.inputValue(tipOpacityNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { float ton=noise::atPointUV(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq)*2-1; res[i].tipOpa=min(max(color.x+ton*noiseAmp,0.0),1.0); } } else if(attrName=="baseOpacity") { float noiseAmp=data.inputValue(baseOpacityNoiseAmp).asFloat(); float noiseFreq=data.inputValue(baseOpacityNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { float bon=noise::atPointUV(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq)*2-1; res[i].baseOpa=min(max(color.x+bon*noiseAmp,0.0),1.0); } } else if(attrName=="baseColor") { float noiseAmp=data.inputValue(baseColorNoiseAmp).asFloat(); float noiseFreq=data.inputValue(baseColorNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { pnt bcn=noise::atPointUVColor(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq); bcn.x=(bcn.x*2-1)*noiseAmp; bcn.y=(bcn.y*2-1)*noiseAmp; bcn.z=(bcn.z*2-1)*noiseAmp; res[i].baseColorR=min(max(color.x+bcn.x,0.0),1.0); res[i].baseColorG=min(max(color.y+bcn.y,0.0),1.0); res[i].baseColorB=min(max(color.z+bcn.z,0.0),1.0); } } else if(attrName=="tipColor") { float noiseAmp=data.inputValue(tipColorNoiseAmp).asFloat(); float noiseFreq=data.inputValue(tipColorNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { pnt tcn=noise::atPointUVColor(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq); tcn.x=(tcn.x*2-1)*noiseAmp; tcn.y=(tcn.y*2-1)*noiseAmp; tcn.z=(tcn.z*2-1)*noiseAmp; res[i].tipColorR=min(max(color.x+tcn.x,0.0),1.0); res[i].tipColorG=min(max(color.y+tcn.y,0.0),1.0); res[i].tipColorB=min(max(color.z+tcn.z,0.0),1.0); } } return; } MImage imgFn; imgFn.readFromTextureNode(arr[0].node()); unsigned int imageWidth,imageHeight,imageDepth; imgFn.getSize(imageWidth,imageHeight); imageDepth=4; unsigned char * pixels=imgFn.pixels(); if(attrName=="densityMap") for(int i=0;i<uvs.size()/2;i++) { int pixelW=uvs[2*i]*imageWidth; int pixelH=uvs[2*i+1]*imageHeight; res[i].density=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)])/255.0; } else if(attrName=="tipOpacity") { float noiseAmp=data.inputValue(tipOpacityNoiseAmp).asFloat(); float noiseFreq=data.inputValue(tipOpacityNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { float ton=noise::atPointUV(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq)*2-1; int pixelW=uvs[2*i]*imageWidth; int pixelH=uvs[2*i+1]*imageHeight; res[i].tipOpa=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)])/255.0; res[i].tipOpa=min(max(res[i].tipOpa+ton*noiseAmp,0.0),1.0); } } else if(attrName=="baseOpacity") { float noiseAmp=data.inputValue(baseOpacityNoiseAmp).asFloat(); float noiseFreq=data.inputValue(baseOpacityNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { float bon=noise::atPointUV(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq)*2-1; int pixelW=uvs[2*i]*imageWidth; int pixelH=uvs[2*i+1]*imageHeight; res[i].baseOpa=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)])/255.0; res[i].baseOpa=min(max(res[i].baseOpa+bon*noiseAmp,0.0),1.0); } } else if(attrName=="baseColor") { float noiseAmp=data.inputValue(baseColorNoiseAmp).asFloat(); float noiseFreq=data.inputValue(baseColorNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { pnt bcn=noise::atPointUVColor(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq); bcn.x=(bcn.x*2-1)*noiseAmp; bcn.y=(bcn.y*2-1)*noiseAmp; bcn.z=(bcn.z*2-1)*noiseAmp; int pixelW=uvs[2*i]*imageWidth; int pixelH=uvs[2*i+1]*imageHeight; res[i].baseColorR=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)])/255.0; res[i].baseColorG=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)+1])/255.0; res[i].baseColorB=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)+2])/255.0; res[i].baseColorR=min(max(res[i].baseColorR+bcn.x,0.0),1.0); res[i].baseColorG=min(max(res[i].baseColorG+bcn.y,0.0),1.0); res[i].baseColorB=min(max(res[i].baseColorB+bcn.z,0.0),1.0); } } else if(attrName=="tipColor") { float noiseAmp=data.inputValue(tipColorNoiseAmp).asFloat(); float noiseFreq=data.inputValue(tipColorNoiseFreq).asFloat(); for(int i=0;i<uvs.size()/2;i++) { pnt tcn=noise::atPointUVColor(uvs[2*i]*noiseFreq,uvs[2*i+1]*noiseFreq); tcn.x=(tcn.x*2-1)*noiseAmp; tcn.y=(tcn.y*2-1)*noiseAmp; tcn.z=(tcn.z*2-1)*noiseAmp; int pixelW=uvs[2*i]*imageWidth; int pixelH=uvs[2*i+1]*imageHeight; res[i].tipColorR=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)])/255.0; res[i].tipColorG=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)+1])/255.0; res[i].tipColorB=((unsigned int)pixels[imageDepth*(pixelH*imageWidth+pixelW)+2])/255.0; res[i].tipColorR=min(max(res[i].tipColorR+tcn.x,0.0),1.0); res[i].tipColorG=min(max(res[i].tipColorG+tcn.y,0.0),1.0); res[i].tipColorB=min(max(res[i].tipColorB+tcn.z,0.0),1.0); } } }