Skip to content
Snippets Groups Projects
collision.py 5.28 KiB
Newer Older
neomonkeus's avatar
neomonkeus committed
"""Nif User Interface, custom nif properties store for collisions settings"""

# ***** BEGIN LICENSE BLOCK *****
# 
# Copyright © 2014, NIF File Format Library and Tools contributors.
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
# 
#    * Redistributions in binary form must reproduce the above
#      copyright notice, this list of conditions and the following
#      disclaimer in the documentation and/or other materials provided
#      with the distribution.
# 
#    * Neither the name of the NIF File Format Library and Tools
#      project nor the names of its contributors may be used to endorse
#      or promote products derived from this software without specific
#      prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# ***** END LICENSE BLOCK *****

from bpy.props import (PointerProperty,
                       IntProperty,
                       BoolProperty,
                       EnumProperty,
neomonkeus's avatar
neomonkeus committed
                       FloatProperty,
from bpy.types import PropertyGroup
from pyffi.formats.nif import NifFormat

from io_scene_niftools.utils.decorators import register_classes, unregister_classes

def game_specific_col_layer_items(self, context):
    """Items for collision layers based on the currently selected game"""
    if context is None:
        current_game = bpy.context.scene.niftools_scene.game
    else:
        current_game = context.scene.niftools_scene.game
    if current_game == "OBLIVION":
        col_layer_format = NifFormat.OblivionLayer
    elif current_game == "FALLOUT_3":
        col_layer_format = NifFormat.OblivionLayer
    elif current_game == "SKYRIM":
        col_layer_format = NifFormat.SkyrimLayer
    return [(str(value), item, "", value) for value, item in zip(col_layer_format._enumvalues, col_layer_format._enumkeys)]

neomonkeus's avatar
neomonkeus committed
class CollisionProperty(PropertyGroup):
    """Group of Havok related properties, which gets attached to objects through a property pointer."""

    motion_system: EnumProperty(
        name='Motion System',
        description='Havok Motion System settings for bhkRigidBody(t)',
        items=[(item, item, "", i) for i, item in enumerate(NifFormat.MotionSystem._enumkeys)],
        # default = 'MO_SYS_FIXED',

    )

    collision_layer: EnumProperty(
        name='Collision layer',
        description='Collision layer string (game-specific)',
        items=game_specific_col_layer_items,
    penetration_depth: FloatProperty(
        name='Penetration Depth',
        description='The maximum allowed penetration for this object.',
        default=0.15
    )

    deactivator_type: EnumProperty(
        name='Deactivator Type',
        description='Motion deactivation setting',
        items=[(item, item, "", i) for i, item in enumerate(NifFormat.DeactivatorType._enumkeys)],
    )

    solver_deactivation: EnumProperty(
        name='Solver Deactivation',
        description='Motion deactivation setting',
        items=[(item, item, "", i) for i, item in enumerate(NifFormat.SolverDeactivation._enumkeys)],
    )

    quality_type: EnumProperty(
        name='Quality Type',
        description='Determines quality of motion',
        items=[(item, item, "", i) for i, item in enumerate(NifFormat.MotionQuality._enumkeys)],
        # default = 'MO_QUAL_FIXED',
    )

    col_filter: IntProperty(
        name='Col Filter',
        description='Flags for bhkRigidBody(t)',
        default=0
    )

    max_linear_velocity: FloatProperty(
        name='Max Linear Velocity',
        description='Linear velocity limit for bhkRigidBody(t)',
        default=0
    )

    max_angular_velocity: FloatProperty(
        name='Max Angular Velocity',
        description='Angular velocity limit for bhkRigidBody(t)',
        default=0
    )

    export_bhklist: BoolProperty(
        name='Export BHKList',
        description='None',
        default=False
    )

    use_blender_properties: BoolProperty(
        name='Use Blender Properties',
        description='Whether or not to export collision settings via blender properties',
        default=False,
    )


CLASSES = [
    CollisionProperty
]


def register():
    register_classes(CLASSES, __name__)

    bpy.types.Object.nifcollision = bpy.props.PointerProperty(type=CollisionProperty)


def unregister():
    del bpy.types.Object.nifcollision

    unregister_classes(CLASSES, __name__)