You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

213 lines
9.6 KiB

# 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 PyHSPlasma import *
from ..addon_prefs import game_versions
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.4, 0.3, 0.1),
min=0.0,
max=1.0,
subtype="COLOR")
fog_method = EnumProperty(name="Fog Type",
items=[
("linear", "Linear", "Fog Based on Linear Distance"),
("exp", "Exponential", "Fog Based on Exponential Distance"),
("exp2", "Exponential 2", "Fog Based on Exponential Distance Squared"),
("none", "None", "No Fog")
])
fog_start = FloatProperty(name="Start",
description="",
default=-1500.0)
fog_end = FloatProperty(name="End",
description="",
default=20000.0)
fog_density = FloatProperty(name="Density",
description="",
default=1.0,
min=0.0)
clear_color = FloatVectorProperty(name="Clear Color",
description="The default background color rendered in your age",
min=0.0,
max=1.0,
subtype="COLOR")
yon = IntProperty(name="Draw Distance",
description="The distance (in feet) Plasma will draw",
default=100000,
soft_min=100,
min=1)
class PlasmaGames(bpy.types.PropertyGroup):
bl_idname = "world.plasma_games"
active_game_index = IntProperty(options={"HIDDEN"})
@property
def active_game(self):
if len(self.games) > self.active_game_index and self.active_game_index != -1:
return self.games[self.active_game_index]
return None
@property
def is_game_active(self):
return len(self.games) > 0 and self.active_game_index != -1
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 and page != self:
# 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
# There are some obviously bad page names
if self.name.lower() in {"", "builtin", "default", "textures"}:
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)
local_only = BoolProperty(name="Local Only",
description="This page should not synchronize with the server",
default=False)
enabled = BoolProperty(name="Export Page",
description="Export this page",
default=True)
version = EnumProperty(name="Export Versions",
description="Plasma versions this page exports under",
items=game_versions,
options={"ENUM_FLAG"},
default=set(list(zip(*game_versions))[0]))
page_type = EnumProperty(name="Page Type",
description="Type of data this page contains",
items=[
("room", "Room", "A standard Plasma Room containing scene objects"),
("external", "External", "A page generated by an external process. Korman will not write to this page, ever."),
("gui", "Game GUI", "A page containing Game GUI objects.")
],
default="room",
options=set())
# 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):
def export(self, exporter):
if exporter.mgr.getVer() == pvMoul:
log_func = exporter.report.warn
else:
log_func = exporter.report.port
if self.seq_prefix <= self.MOUL_PREFIX_RANGE[0] or self.seq_prefix >= self.MOUL_PREFIX_RANGE[1]:
log_func("Age Sequence Prefix {} is potentially out of range (should be between {} and {})",
self.seq_prefix, *self.MOUL_PREFIX_RANGE)
_age_info = plAgeInfo()
_age_info.dayLength = self.day_length
_age_info.lingerTime = 180 # this is fairly standard
_age_info.maxCapacity = 50 # the server currently ignores this
_age_info.name = exporter.age_name
_age_info.seqPrefix = self.seq_prefix
_age_info.startDateTime = self.start_time
return _age_info
# Sequence prefix helpers
MOUL_PREFIX_RANGE = ((pow(2, 16) - pow(2, 15)) * -1, pow(2, 15) - 1)
SP_PRFIX_RANGE = ((pow(2, 24) - pow(2, 23)) * -1, pow(2, 23) - 1)
day_length = FloatProperty(name="Day Length",
description="Length of a day (in hours) on this age",
default=30.230000,
soft_min=0.1,
min=0.0)
start_time = IntProperty(name="Start Time",
description="Seconds from 1/1/1970 until the first day on this age",
subtype="UNSIGNED",
default=672211080,
min=0)
seq_prefix = IntProperty(name="Sequence Prefix",
description="A unique numerical ID for this age",
min=SP_PRFIX_RANGE[0],
soft_min=0, # Negative indicates global--advanced users only
soft_max=MOUL_PREFIX_RANGE[1],
max=SP_PRFIX_RANGE[1],
default=100)
pages = CollectionProperty(name="Pages",
description="Registry pages for this age",
type=PlasmaPage)
age_sdl = BoolProperty(name="Age Global SDL",
description="This age has its own SDL file",
default=False)
use_texture_page = BoolProperty(name="Use Textures Page",
description="Exports all textures to a dedicated Textures page",
default=True)
age_name = StringProperty(name="Age Name",
description="Name of the Age to be used for data files",
options=set())
# Implementation details
active_page_index = IntProperty(name="Active Page Index")