mirror of https://github.com/H-uru/korman.git
Browse Source
This allows us to use Blender's Sound datablocks, despite it actively opposing our attempts to do so. Meaning the artist can pack their sounds. :)pull/35/head
Adam Johnson
9 years ago
6 changed files with 215 additions and 0 deletions
@ -0,0 +1,88 @@
|
||||
# This file is part of Korman. |
||||
# |
||||
# Korman is free software: you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation, either version 3 of the License, or |
||||
# (at your option) any later version. |
||||
# |
||||
# Korman is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with Korman. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
import bpy |
||||
from bpy.props import * |
||||
|
||||
class SoundOperator: |
||||
@classmethod |
||||
def poll(cls, context): |
||||
return context.scene.render.engine == "PLASMA_GAME" |
||||
|
||||
|
||||
class PlasmaSoundOpenOperator(SoundOperator, bpy.types.Operator): |
||||
bl_idname = "sound.plasma_open" |
||||
bl_label = "Load Sound" |
||||
bl_options = {"INTERNAL"} |
||||
|
||||
filter_glob = StringProperty(default="*.ogg;*.wav", options={"HIDDEN"}) |
||||
filepath = StringProperty(subtype="FILE_PATH") |
||||
|
||||
data_path = StringProperty(options={"HIDDEN"}) |
||||
sound_property = StringProperty(options={"HIDDEN"}) |
||||
|
||||
def execute(self, context): |
||||
# Check to see if the sound exists... Because the sneakily introduced bpy.data.sounds.load |
||||
# check_existing doesn't tell us if it already exists... dammit... |
||||
# We don't want to take ownership forcefully if we don't have to. |
||||
for i in bpy.data.sounds: |
||||
if self.filepath == i.filepath: |
||||
sound = i |
||||
break |
||||
else: |
||||
sound = bpy.data.sounds.load(self.filepath) |
||||
sound.plasma_owned = True |
||||
sound.use_fake_user = True |
||||
|
||||
# Now do the stanky leg^H^H^H^H^H^H^H^H^H^H deed and put the sound on the mod |
||||
dest = eval(self.data_path) |
||||
setattr(dest, self.sound_property, sound.name) |
||||
return {"FINISHED"} |
||||
|
||||
def invoke(self, context, event): |
||||
context.window_manager.fileselect_add(self) |
||||
return {"RUNNING_MODAL"} |
||||
|
||||
|
||||
class PlasmaSoundPackOperator(SoundOperator, bpy.types.Operator): |
||||
bl_idname = "sound.plasma_pack" |
||||
bl_label = "Pack" |
||||
bl_options = {"INTERNAL"} |
||||
|
||||
def execute(self, context): |
||||
soundemit = context.active_object.plasma_modifiers.soundemit |
||||
sound = bpy.data.sounds.get(soundemit.sounds[soundemit.active_sound_index].sound_data) |
||||
sound.pack() |
||||
return {"FINISHED"} |
||||
|
||||
|
||||
class PlasmaSoundUnpackOperator(SoundOperator, bpy.types.Operator): |
||||
bl_idname = "sound.plasma_unpack" |
||||
bl_label = "Unpack" |
||||
bl_options = {"INTERNAL"} |
||||
|
||||
method = EnumProperty(name="Method", description="How to unpack", |
||||
# See blender/makesrna/intern/rna_packedfile.c |
||||
items=[("USE_LOCAL", "Use local file", "", 5), |
||||
("WRITE_LOCAL", "Write Local File (overwrite existing)", "", 4), |
||||
("USE_ORIGINAL", "Use Original File", "", 6), |
||||
("WRITE_ORIGINAL", "Write Original File (overwrite existing)", "", 3)], |
||||
options=set()) |
||||
|
||||
def execute(self, context): |
||||
soundemit = context.active_object.plasma_modifiers.soundemit |
||||
sound = bpy.data.sounds.get(soundemit.sounds[soundemit.active_sound_index].sound_data) |
||||
sound.unpack(self.method) |
||||
return {"FINISHED"} |
@ -0,0 +1,64 @@
|
||||
# This file is part of Korman. |
||||
# |
||||
# Korman is free software: you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation, either version 3 of the License, or |
||||
# (at your option) any later version. |
||||
# |
||||
# Korman is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with Korman. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
import bpy |
||||
from bpy.props import * |
||||
from bpy.app.handlers import persistent |
||||
from PyHSPlasma import * |
||||
|
||||
from .base import PlasmaModifierProperties |
||||
from ...exporter import ExportError |
||||
|
||||
class PlasmaSound(bpy.types.PropertyGroup): |
||||
enabled = BoolProperty(name="Enabled", default=True, options=set()) |
||||
sound_data = StringProperty(name="Sound", description="Sound Datablock", options=set()) |
||||
|
||||
|
||||
class PlasmaSoundEmitter(PlasmaModifierProperties): |
||||
pl_id = "soundemit" |
||||
|
||||
bl_category = "Logic" |
||||
bl_label = "Sound Emitter" |
||||
bl_description = "Point at which sound(s) are played" |
||||
bl_icon = "SPEAKER" |
||||
|
||||
sounds = CollectionProperty(type=PlasmaSound) |
||||
active_sound_index = IntProperty(options={"HIDDEN"}) |
||||
|
||||
def export(self, exporter, bo, so): |
||||
pass |
||||
|
||||
@classmethod |
||||
def register(cls): |
||||
bpy.types.Sound.plasma_owned = BoolProperty(default=False, options={"HIDDEN"}) |
||||
|
||||
@property |
||||
def requires_actor(self): |
||||
return True |
||||
|
||||
|
||||
@persistent |
||||
def _toss_orphaned_sounds(scene): |
||||
used_sounds = set() |
||||
for i in bpy.data.objects: |
||||
soundemit = i.plasma_modifiers.soundemit |
||||
used_sounds.update((j.sound_data for j in soundemit.sounds)) |
||||
for i in bpy.data.sounds: |
||||
if i.plasma_owned and i.name not in used_sounds: |
||||
i.use_fake_user = False |
||||
i.user_clear() |
||||
|
||||
# collects orphaned Plasma owned sound datablocks |
||||
bpy.app.handlers.save_pre.append(_toss_orphaned_sounds) |
@ -0,0 +1,60 @@
|
||||
# This file is part of Korman. |
||||
# |
||||
# Korman is free software: you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation, either version 3 of the License, or |
||||
# (at your option) any later version. |
||||
# |
||||
# Korman is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with Korman. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
import bpy |
||||
|
||||
class SoundListUI(bpy.types.UIList): |
||||
def draw_item(self, context, layout, data, item, icon, active_data, active_property, index=0, flt_flag=0): |
||||
if item.sound_data: |
||||
sound = bpy.data.sounds.get(item.sound_data) |
||||
icon = "SOUND" if sound is not None else "ERROR" |
||||
layout.prop(item, "sound_data", emboss=False, icon=icon, text="") |
||||
layout.prop(item, "enabled", text="") |
||||
else: |
||||
layout.label("[Empty]") |
||||
|
||||
|
||||
def soundemit(modifier, layout, context): |
||||
row = layout.row() |
||||
row.template_list("SoundListUI", "sounds", modifier, "sounds", modifier, "active_sound_index", |
||||
rows=2, maxrows=3) |
||||
col = row.column(align=True) |
||||
op = col.operator("object.plasma_modifier_collection_add", icon="ZOOMIN", text="") |
||||
op.modifier = modifier.pl_id |
||||
op.collection = "sounds" |
||||
op = col.operator("object.plasma_modifier_collection_remove", icon="ZOOMOUT", text="") |
||||
op.modifier = modifier.pl_id |
||||
op.collection = "sounds" |
||||
op.index = modifier.active_sound_index |
||||
|
||||
try: |
||||
sound = modifier.sounds[modifier.active_sound_index] |
||||
except: |
||||
pass |
||||
else: |
||||
# Sound datablock picker |
||||
row = layout.row(align=True) |
||||
row.prop_search(sound, "sound_data", bpy.data, "sounds", text="") |
||||
open_op = row.operator("sound.plasma_open", icon="FILESEL", text="") |
||||
open_op.data_path = repr(sound) |
||||
open_op.sound_property = "sound_data" |
||||
|
||||
# Pack/Unpack |
||||
data = bpy.data.sounds.get(sound.sound_data) |
||||
if data is not None: |
||||
if data.packed_file is None: |
||||
row.operator("sound.plasma_pack", icon="UGLYPACKAGE", text="") |
||||
else: |
||||
row.operator_menu_enum("sound.plasma_unpack", "method", icon="PACKAGE", text="") |
Loading…
Reference in new issue