Browse Source

Ensure soft volume normals always point inward.

pull/176/head
Adam Johnson 5 years ago
parent
commit
eea59f25a9
Signed by: Hoikas
GPG Key ID: 0B6515D6FF6F271E
  1. 16
      korman/properties/modifiers/region.py

16
korman/properties/modifiers/region.py

@ -13,12 +13,13 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Korman. If not, see <http://www.gnu.org/licenses/>. # along with Korman. If not, see <http://www.gnu.org/licenses/>.
import bmesh
import bpy import bpy
from bpy.props import * from bpy.props import *
from PyHSPlasma import * from PyHSPlasma import *
from ...exporter import ExportError, ExportAssertionError from ...exporter import ExportError, ExportAssertionError
from ...helpers import TemporaryObject from ...helpers import bmesh_from_object
from ... import idprops from ... import idprops
from .base import PlasmaModifierProperties, PlasmaModifierLogicWiz from .base import PlasmaModifierProperties, PlasmaModifierLogicWiz
@ -271,18 +272,23 @@ class PlasmaSoftVolume(idprops.IDPropMixin, PlasmaModifierProperties):
# Initialize the plVolumeIsect. Currently, we only support convex isects. If you want parallel # Initialize the plVolumeIsect. Currently, we only support convex isects. If you want parallel
# isects from empties, be my guest... # isects from empties, be my guest...
with TemporaryObject(bo.to_mesh(bpy.context.scene, True, "RENDER", calc_tessface=False), bpy.data.meshes.remove) as mesh: with bmesh_from_object(bo) as mesh:
matrix = bo.matrix_world matrix = bo.matrix_world
#l2w = utils.matrix44(matrix)
xform = matrix.inverted() xform = matrix.inverted()
xform.transpose() xform.transpose()
# Ensure the normals always point inward. This is the same thing that
# bpy.ops.normals_make_consistent(inside=True) does, just no need to change
# into the edit mode context (EXPENSIVE!)
bmesh.ops.recalc_face_normals(mesh, faces=mesh.faces)
bmesh.ops.reverse_faces(mesh, faces=mesh.faces, flip_multires=True)
isect = plConvexIsect() isect = plConvexIsect()
for ngon in mesh.polygons: for ngon in mesh.faces:
normal = xform * ngon.normal * -1 normal = xform * ngon.normal * -1
normal.normalize() normal.normalize()
normal = hsVector3(*normal) normal = hsVector3(*normal)
for vertex in (mesh.vertices[i] for i in ngon.vertices): for vertex in ngon.verts:
pos = matrix * vertex.co pos = matrix * vertex.co
isect.addPlane(normal, hsVector3(*pos)) isect.addPlane(normal, hsVector3(*pos))
sv.volume = isect sv.volume = isect

Loading…
Cancel
Save