mirror of https://github.com/H-uru/korman.git
Browse Source
We are attempting to encourage the pages=layers paradigm; however, this is not strictly enforced. This commit has lots of bits and bobs but little actual substance. More to come when I begin work on the exporter.pull/1/head
Adam Johnson
13 years ago
11 changed files with 413 additions and 3 deletions
@ -0,0 +1,16 @@
|
||||
# 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/>. |
||||
|
||||
from .op_world import * |
@ -0,0 +1,72 @@
|
||||
# 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 AgeOperator: |
||||
@classmethod |
||||
def poll(cls, context): |
||||
return context.scene.render.engine == "PLASMA_GAME" |
||||
|
||||
class PlasmaPageAddOperator(AgeOperator, bpy.types.Operator): |
||||
bl_idname = "world.plasma_page_add" |
||||
bl_label = "Add Page" |
||||
bl_description = "Adds a new Plasma Registry Page" |
||||
|
||||
def execute(self, context): |
||||
w = context.world |
||||
if w: |
||||
age = w.plasma_age |
||||
page = age.pages.add() |
||||
|
||||
# Find the first non-zero ID and suggest that. |
||||
suffixes = [] |
||||
for p in age.pages: |
||||
# Filter out pages with no-id or |
||||
if p.seq_suffix: |
||||
suffixes.append(p.seq_suffix) |
||||
if len(suffixes): |
||||
suffixes.sort() |
||||
test = set(range(suffixes[0], suffixes[-1])) |
||||
missing = test - set(suffixes) |
||||
try: |
||||
suffix = missing.pop() |
||||
except KeyError: |
||||
suffix = suffixes[-1] + 1 |
||||
page.make_default_name(suffix) |
||||
else: |
||||
# Page 0 is a magic "catch-all" page. The user *may* define it |
||||
# if he wants. If he doesn't, we'll defer it until export time |
||||
page.make_default_name(1) |
||||
|
||||
# Finally, select the new page |
||||
age.active_page_index = len(age.pages) - 1 |
||||
return {"FINISHED"} |
||||
else: |
||||
return {"CANCELLED"} |
||||
|
||||
|
||||
class PlasmaPageRemoveOperator(AgeOperator, bpy.types.Operator): |
||||
bl_idname = "world.plasma_page_remove" |
||||
bl_label = "Remove Page" |
||||
bl_description = "Removes the selected Plasma Registry Page" |
||||
|
||||
def execute(self, context): |
||||
w = context.world |
||||
if w: |
||||
# ... |
||||
return {"FINISHED"} |
||||
else: |
||||
return {"CANCELLED"} |
@ -0,0 +1,24 @@
|
||||
# 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 .prop_object import * |
||||
from .prop_world import * |
||||
|
||||
def register(): |
||||
bpy.types.Object.plasma_object = PointerProperty(type=PlasmaObject) |
||||
bpy.types.World.plasma_age = PointerProperty(type=PlasmaAge) |
||||
bpy.types.World.plasma_fni = PointerProperty(type=PlasmaFni) |
@ -0,0 +1,51 @@
|
||||
# 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 PlasmaObject(bpy.types.PropertyGroup): |
||||
def _export_changed(self, context): |
||||
# This makes me sad |
||||
if not self.is_inited: |
||||
self._init(context) |
||||
self.is_inited = True |
||||
|
||||
def _init(self, context): |
||||
o = context.object |
||||
age = context.scene.world.plasma_age |
||||
|
||||
# We want to encourage the pages = layers paradigm. |
||||
# So, let's see which layers we're on and check for a page whose |
||||
# suffix matches our layers. We'll take the first match. |
||||
num_layers = len(o.layers) |
||||
for page in age.pages: |
||||
if page.seq_suffix > num_layers: |
||||
continue |
||||
if o.layers[page.seq_suffix-1]: |
||||
o.plasma_object.page = page.name |
||||
break |
||||
|
||||
export = BoolProperty(name="Export", |
||||
description="Export this as a discrete object", |
||||
default=False, |
||||
update=_export_changed) |
||||
page = StringProperty(name="Page", |
||||
description="Page this object will be exported to") |
||||
|
||||
# Implementation Details |
||||
is_inited = BoolProperty(description="INTERNAL: Init proc complete", |
||||
default=False, |
||||
options={"HIDDEN"}) |
@ -0,0 +1,114 @@
|
||||
# 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 PlasmaFni(bpy.types.PropertyGroup): |
||||
bl_idname = "world.plasma_fni" |
||||
|
||||
fog_color = FloatVectorProperty(name="Fog Color", |
||||
description="The default fog color used in your age", |
||||
default=(0.3, 0.2, 0.05), |
||||
subtype="COLOR") |
||||
clear_color = FloatVectorProperty(name="Clear Color", |
||||
description="The default background color rendered in your age", |
||||
subtype="COLOR") |
||||
yon = IntProperty(name="Draw Distance", |
||||
description="The distance (in feet) Plasma will draw", |
||||
default=100000, |
||||
soft_min=100, |
||||
min=1) |
||||
# TODO: density |
||||
|
||||
class PlasmaPage(bpy.types.PropertyGroup): |
||||
def _check_suffix(self, context): |
||||
"""Verifies that a suffix change does not conflict""" |
||||
old = self.last_seq_suffix |
||||
self.last_seq_suffix = self.seq_suffix |
||||
if not self.check_suffixes: |
||||
return None |
||||
|
||||
for page in context.world.plasma_age.pages: |
||||
if page.seq_suffix == self.seq_suffix: |
||||
# Need to supress checking while we override the suffix |
||||
page.check_suffixes = False |
||||
page.seq_suffix = old |
||||
page.check_suffixes = True |
||||
break |
||||
return None |
||||
|
||||
def _rename_page(self, context): |
||||
# Need to init? |
||||
if self.last_name == "" and self.name: |
||||
self.last_name = self.name |
||||
return None |
||||
|
||||
# Empty page names not allowed! |
||||
if self.name == "": |
||||
self.make_default_name(self.seq_suffix) |
||||
return None |
||||
|
||||
# Since many objects will have page names attached to them, we'll be |
||||
# very nice and handle renames for the user. |
||||
for obj in bpy.data.objects: |
||||
if obj.plasma_object.page == self.last_name: |
||||
obj.plasma_object.page = self.name |
||||
self.last_name = self.name |
||||
return None |
||||
|
||||
def make_default_name(self, suffix): |
||||
self.seq_suffix = suffix |
||||
self.name = "Page%02i" % suffix |
||||
self.check_suffixes = True |
||||
|
||||
name = StringProperty(name="Name", |
||||
description="Name of the specified page", |
||||
update=_rename_page) |
||||
seq_suffix = IntProperty(name="ID", |
||||
description="A numerical ID for this page", |
||||
soft_min=0, # Negatives indicate global--advanced users only |
||||
default=0, # The add operator will autogen a default |
||||
update=_check_suffix) |
||||
auto_load = BoolProperty(name="Auto Load", |
||||
description="Load this page on link-in", |
||||
default=True) |
||||
|
||||
# Implementation details... |
||||
last_name = StringProperty(description="INTERNAL: Cached page name", |
||||
options={"HIDDEN"}) |
||||
last_seq_suffix = IntProperty(description="INTERNAL: Cached sequence suffix", |
||||
options={"HIDDEN"}) |
||||
check_suffixes = BoolProperty(description="INTERNAL: Should we sanity-check suffixes?", |
||||
options={"HIDDEN"}, |
||||
default=False) |
||||
|
||||
|
||||
class PlasmaAge(bpy.types.PropertyGroup): |
||||
day_length = FloatProperty(name="Day Length", |
||||
description="Length of a day (in hours) on this age", |
||||
default=24.0, |
||||
soft_min=0.1, |
||||
min=0.0) |
||||
seq_prefix = IntProperty(name="Sequence Prefix", |
||||
description="A unique numerical ID for this age", |
||||
soft_min=0, # Negative indicates global--advanced users only |
||||
default=100) |
||||
pages = CollectionProperty(name="Pages", |
||||
description="Registry pages for this age", |
||||
type=PlasmaPage) |
||||
|
||||
# Implementation details |
||||
active_page_index = IntProperty(name="Active Page Index") |
@ -0,0 +1,17 @@
|
||||
# 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/>. |
||||
|
||||
from .ui_object import * |
||||
from .ui_world import * |
@ -0,0 +1,40 @@
|
||||
# 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 ObjectButtonsPanel: |
||||
bl_space_type = "PROPERTIES" |
||||
bl_region_type = "WINDOW" |
||||
bl_context = "object" |
||||
|
||||
@classmethod |
||||
def poll(cls, context): |
||||
return context.object and context.scene.render.engine == "PLASMA_GAME" |
||||
|
||||
|
||||
class PlasmaObjectPanel(ObjectButtonsPanel, bpy.types.Panel): |
||||
bl_label = "Plasma Object" |
||||
|
||||
def draw_header(self, context): |
||||
self.layout.prop(context.object.plasma_object, "export", text="") |
||||
|
||||
def draw(self, context): |
||||
layout = self.layout |
||||
pl_obj = context.object.plasma_object |
||||
pl_age = context.scene.world.plasma_age |
||||
layout.active = pl_obj.export |
||||
|
||||
layout.prop_search(pl_obj, "page", pl_age, "pages", icon="BOOKMARKS") |
@ -0,0 +1,69 @@
|
||||
# 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 AgeButtonsPanel: |
||||
bl_space_type = "PROPERTIES" |
||||
bl_region_type = "WINDOW" |
||||
bl_context = "world" |
||||
|
||||
@classmethod |
||||
def poll(cls, context): |
||||
return context.world and context.scene.render.engine == "PLASMA_GAME" |
||||
|
||||
|
||||
class PlasmaAgePanel(AgeButtonsPanel, bpy.types.Panel): |
||||
bl_label = "Plasma Age" |
||||
|
||||
def draw(self, context): |
||||
layout = self.layout |
||||
age = context.world.plasma_age |
||||
|
||||
# Core age settings |
||||
# ... |
||||
|
||||
# We want a list of pages and an editor below that |
||||
row = layout.row() |
||||
row.template_list(age, "pages", age, "active_page_index", rows=2) |
||||
col = row.column(align=True) |
||||
col.operator("world.plasma_page_add", icon="ZOOMIN", text="") |
||||
col.operator("world.plasma_page_remove", icon="ZOOMOUT", text="") |
||||
|
||||
# name/id editor for current selection |
||||
if age.active_page_index < len(age.pages): |
||||
active_page = age.pages[age.active_page_index] |
||||
split = layout.split(percentage=0.65) |
||||
col = split.column() |
||||
col.prop(active_page, "name") |
||||
col = split.column() |
||||
col.prop(active_page, "seq_suffix") |
||||
|
||||
|
||||
class PlasmaEnvironmentPanel(AgeButtonsPanel, bpy.types.Panel): |
||||
bl_label = "Plasma Environment" |
||||
|
||||
def draw(self, context): |
||||
layout = self.layout |
||||
fni = context.world.plasma_fni |
||||
|
||||
# Column-ize the colors |
||||
split = layout.split() |
||||
col = split.column() |
||||
col.prop(fni, "fog_color") |
||||
col = split.column() |
||||
col.prop(fni, "clear_color") |
||||
|
||||
layout.prop(fni, "yon") |
Loading…
Reference in new issue