コード例 #1
0
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);
		}
	}
}