Forum: Poser Python Scripting


Subject: Flipping Normals

redspark opened this issue on Jun 21, 2020 ยท 13 posts


adp001 posted Mon, 22 June 2020 at 10:38 AM

import numpy as NP

def po_reverse_normals(actor_or_geom):
    if isinstance(actor_or_geom, poser.ActorType):
        geom = actor_or_geom.Geometry()
    elif isinstance(actor_or_geom, poser.GeomType):
        geom = actor_or_geom
    else:
        raise Exception("Parameter must be actor or geometry.")

    verts = NP.array([[v.X(), v.Y(), v.Z()] for v in geom.Vertices()], NP.float)
    tverts = NP.array([[v.U(), v.V()] for v in geom.TexVertices()], NP.float)
    sets = NP.array([s for s in geom.Sets()], NP.int32)
    tsets = NP.array([s for s in geom.TexSets()], NP.int32)
    polygons = NP.array([[p.Start(), p.NumVertices()] for p in geom.Polygons()], NP.int32)
    tpolygons = NP.array([[p.Start(), p.NumTexVertices()] for p in geom.TexPolygons()], NP.int32)

    for p in polygons:
        start, end = p[0], p[0]+p[1]
        s = v[start:end]
        sets[start:end] = NP.flipud(s)

    new_geom = poser.NewGeometry()
    new_geom.AddGeneralMesh(polygons, sets, verts, tpolygons, tsets, tverts)
    if isinstance(actor_or_geom, poser.ActorType):
        actor_or_geom.SetGeometry(new_geom)
        return actor_or_geom
    else:
        return poser.Scene().CreatePropFromGeom(new_geom)


if __name__ == "__main__":
    po_reverse_normals(poser.Scene().CurrentActor())
    poser.Scene().DrawAll()