# ---------------------------------------------------------------------------------------
# --- class to sample vertexmaps from shaders -------------------------------------------
# ---------------------------------------------------------------------------------------
class ShaderToVertexmapSampler(object):
def ShaderSampleVertexmap(self, document, polygonobject, uvwtag, vertexmap, shader, spline, istile, uvoffset, uvscale):
# get data
pointdata = [None] * polygonobject.GetPointCount()
# create and prepare channeldata
cd = ChannelData()
cd.t = document.GetTime().Get()
cd.d = c4d.Vector()
cd.n = c4d.Vector(0, 0, 1)
if istile:
cd.texflag = c4d.TEX_TILE
else:
cd.texflag = 0
if shader[c4d.SHADER_MIPOFFSET]:
cd.off = shader[c4d.SHADER_MIPOFFSET]
else:
cd.off = 0.0
if shader[c4d.SHADER_MIPSCALE]:
cd.scale = shader[c4d.SHADER_MIPSCALE]
else:
cd.scale = 0.0
# sample the shader
shader.InitRender(c4d.modules.render.InitRenderStruct())
for i in xrange(polygonobject.GetPolygonCount()):
uvw = uvwtag.GetSlow(i)
poly = polygonobject.GetPolygon(i)
if pointdata[poly.a] == None:
cd.p = self.offsetScaleVector(uvw['a'], uvoffset, uvscale)
pointdata[poly.a] = self.mapColorToBrightness(color = shader.Sample(cd),
spline = spline)
if pointdata[poly.b] == None:
cd.p = self.offsetScaleVector(uvw['b'], uvoffset, uvscale)
pointdata[poly.b] = self.mapColorToBrightness(color = shader.Sample(cd),
spline = spline)
if pointdata[poly.c] == None:
cd.p = self.offsetScaleVector(uvw['c'], uvoffset, uvscale)
pointdata[poly.c] = self.mapColorToBrightness(color = shader.Sample(cd),
spline = spline)
if pointdata[poly.d] == None:
cd.p = self.offsetScaleVector(uvw['d'], uvoffset, uvscale)
pointdata[poly.d] = self.mapColorToBrightness(color = shader.Sample(cd),
spline = spline)
shader.FreeRender()
# write vertexmap data
vertexmap.SetAllHighlevelData(pointdata)
# --- scale and offset the uv vector.
# --> Vector
# -----------------------------------------------------------------------------------
def offsetScaleVector(self, vector, offset, scale):
v = (vector + offset)
return c4d.Vector(v.x * (1 / (scale.x + 0.001)), v.y * (1 / (scale.y + 0.001)), v.z)
# --- apply clamping to color vector, convert it into a brightness value and weight
# --- the brightness.
# --> float
# -----------------------------------------------------------------------------------
def mapColorToBrightness(self, color, spline):
brightness = (color.x * 0.3) + (color.y * 0.59) + (color.z * 0.11)
return utils.RangeMap(value = brightness,
mininput = 0.0,
maxinput = 1.0,
minoutput = 0.0,
maxoutput = 1.0,
clampval = False,
curve = spline)