Code Vonc

Convertir les modifications UVW

v 1.0

Script Python pour Cinéma 4D R13.

TéléchargerDownload
Faire un donMake a donation
Comment installer ?How to install ?
CommentairesComments

Convertit le décalage et la longueur de la projection UVW des objets sélectionnés tout en gardant le même dépliage.




import c4d
from c4d import Vector

# v 1.0 - César Vonc - code.vonc.fr

def nb_dec(n) :
    n = abs(n)
    dec = n - int(n)
    nb = str(dec)
    nb = len(nb) - 2
    return nb

def modif_coor(p, tex, lcX, lcY) :
    p -= Vector(tex[c4d.TEXTURETAG_OFFSETX], tex[c4d.TEXTURETAG_OFFSETY], 0)
    
    if lcX is True :
        p.x /= tex[c4d.TEXTURETAG_LENGTHX]
    else :
        p.x *= tex[c4d.TEXTURETAG_TILESX]
        
    if lcY is True :
        p.y /= tex[c4d.TEXTURETAG_LENGTHY]
    else :
        p.y *= tex[c4d.TEXTURETAG_TILESY]
        
    return p

def converti(obj) :
    tex = obj.GetTag(c4d.Ttexture)
    if not tex : return
    uvw = obj.GetTag(c4d.Tuvw)
    if not uvw : return
    
    polys = uvw.GetDataCount()
    lcX  = True # Longueur ou Carreaux X
    lcY  = True # Longueur ou Carreaux Y
    if nb_dec(tex[c4d.TEXTURETAG_TILESX]) < nb_dec(tex[c4d.TEXTURETAG_LENGTHX]*100) :
        lcX = False
    if nb_dec(tex[c4d.TEXTURETAG_TILESY]) < nb_dec(tex[c4d.TEXTURETAG_LENGTHY]*100) :
        lcY = False
    
    for i in xrange(polys):
        uvwdict = uvw.GetSlow(i)
        a = modif_coor(uvwdict["a"], tex, lcX, lcY)
        b = modif_coor(uvwdict["b"], tex, lcX, lcY)
        c = modif_coor(uvwdict["c"], tex, lcX, lcY)
        d = modif_coor(uvwdict["d"], tex, lcX, lcY)
        uvw.SetSlow(i, a, b, c, d)
    
    tex[c4d.TEXTURETAG_OFFSETX] = 0
    tex[c4d.TEXTURETAG_OFFSETY] = 0
    tex[c4d.TEXTURETAG_LENGTHX] = 1
    tex[c4d.TEXTURETAG_LENGTHY] = 1
    tex[c4d.TEXTURETAG_TILESX] = 1
    tex[c4d.TEXTURETAG_TILESY] = 1

def convertir_uvw() :
    objs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0)
    nb = len(objs)
    if nb == 0 : return
    
    doc.StartUndo()
    
    for obj in objs :
        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
        converti(obj)
    
    doc.EndUndo()
    c4d.EventAdd()
    
if __name__=='__main__':
    convertir_uvw()