mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 09:52:27 -04:00
fix distributed treasure, donald's boat
This commit is contained in:
parent
045688d305
commit
e735658356
@ -169,16 +169,7 @@ class MetaInterval(CMetaInterval):
|
|||||||
def addInterval(self, ival, relTime, relTo):
|
def addInterval(self, ival, relTime, relTo):
|
||||||
# Adds the given interval to the MetaInterval.
|
# Adds the given interval to the MetaInterval.
|
||||||
|
|
||||||
if isinstance(ival, MetaInterval):
|
if isinstance(ival, CInterval):
|
||||||
# It's another MetaInterval, so copy in its intervals
|
|
||||||
# directly to this object. We could just store the
|
|
||||||
# MetaInterval itself, which would work, but we get a
|
|
||||||
# performance advantage by flattening out the deeply
|
|
||||||
# nested hierarchy into a linear list within the root
|
|
||||||
# CMetaInterval object.
|
|
||||||
ival.applyIvals(self, relTime, relTo)
|
|
||||||
|
|
||||||
elif isinstance(ival, CInterval):
|
|
||||||
# It's a C++-style Interval, so add it directly.
|
# It's a C++-style Interval, so add it directly.
|
||||||
if getattr(ival, "inPython", 0):
|
if getattr(ival, "inPython", 0):
|
||||||
# Actually, it's been flagged to run in Python, even
|
# Actually, it's been flagged to run in Python, even
|
||||||
@ -190,6 +181,16 @@ class MetaInterval(CMetaInterval):
|
|||||||
self.pythonIvals.append(ival)
|
self.pythonIvals.append(ival)
|
||||||
self.addExtIndex(index, ival.getName(), ival.getDuration(),
|
self.addExtIndex(index, ival.getName(), ival.getDuration(),
|
||||||
ival.getOpenEnded(), relTime, relTo)
|
ival.getOpenEnded(), relTime, relTo)
|
||||||
|
|
||||||
|
elif isinstance(ival, MetaInterval):
|
||||||
|
# It's another MetaInterval, so copy in its intervals
|
||||||
|
# directly to this object. We could just store the
|
||||||
|
# MetaInterval itself, which would work, but we get a
|
||||||
|
# performance advantage by flattening out the deeply
|
||||||
|
# nested hierarchy into a linear list within the root
|
||||||
|
# CMetaInterval object.
|
||||||
|
ival.applyIvals(self, relTime, relTo)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Nope, a perfectly ordinary C++ interval. Hooray!
|
# Nope, a perfectly ordinary C++ interval. Hooray!
|
||||||
self.addCInterval(ival, relTime, relTo)
|
self.addCInterval(ival, relTime, relTo)
|
||||||
@ -315,6 +316,26 @@ class MetaInterval(CMetaInterval):
|
|||||||
CMetaInterval.setFinalT(self)
|
CMetaInterval.setFinalT(self)
|
||||||
self.__doPythonCallbacks()
|
self.__doPythonCallbacks()
|
||||||
|
|
||||||
|
def setIntervalStartTime(self, *args, **kw):
|
||||||
|
# This function overrides from the parent level to force it to
|
||||||
|
# update the interval list first, if necessary.
|
||||||
|
|
||||||
|
self.__updateIvals()
|
||||||
|
# Once we have monkeyed with the interval timings, we'd better
|
||||||
|
# run the whole thing as a monolithic Python interval, since
|
||||||
|
# we can't extract the ivals list back out and append them
|
||||||
|
# into a parent MetaInterval.
|
||||||
|
self.inPython = 1
|
||||||
|
return CMetaInterval.setIntervalStartTime(self, *args, **kw)
|
||||||
|
|
||||||
|
def getIntervalStartTime(self, *args, **kw):
|
||||||
|
# This function overrides from the parent level to force it to
|
||||||
|
# update the interval list first, if necessary.
|
||||||
|
|
||||||
|
self.__updateIvals()
|
||||||
|
return CMetaInterval.getIntervalStartTime(self, *args, **kw)
|
||||||
|
|
||||||
|
|
||||||
def getDuration(self):
|
def getDuration(self):
|
||||||
# This function overrides from the parent level to force it to
|
# This function overrides from the parent level to force it to
|
||||||
# update the interval list first, if necessary.
|
# update the interval list first, if necessary.
|
||||||
|
@ -196,6 +196,130 @@ pop_level() {
|
|||||||
return (int)_defs.size() - 1;
|
return (int)_defs.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: CMetaInterval::set_interval_start_time
|
||||||
|
// Access: Published
|
||||||
|
// Description: Adjusts the start time of the child interval with the
|
||||||
|
// given name, if found. This may be either a C++
|
||||||
|
// interval added via add_c_interval(), or an external
|
||||||
|
// interval added via add_ext_index(); the name must
|
||||||
|
// match exactly.
|
||||||
|
//
|
||||||
|
// If the interval is found, its start time is adjusted,
|
||||||
|
// and all subsequent intervals are adjusting
|
||||||
|
// accordingly, and true is returned. If a matching
|
||||||
|
// interval is not found, nothing is changed and false
|
||||||
|
// is returned.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool CMetaInterval::
|
||||||
|
set_interval_start_time(const string &name, double rel_time,
|
||||||
|
CMetaInterval::RelativeStart rel_to) {
|
||||||
|
Defs::iterator di;
|
||||||
|
for (di = _defs.begin(); di != _defs.end(); ++di) {
|
||||||
|
IntervalDef &def = (*di);
|
||||||
|
|
||||||
|
bool match = false;
|
||||||
|
switch (def._type) {
|
||||||
|
case DT_c_interval:
|
||||||
|
match = (def._c_interval->get_name() == name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_ext_index:
|
||||||
|
match = (def._ext_name == name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (match) {
|
||||||
|
// Here's the interval.
|
||||||
|
def._rel_time = rel_time;
|
||||||
|
def._rel_to = rel_to;
|
||||||
|
mark_dirty();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: CMetaInterval::get_interval_start_time
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns the actual start time, relative to the
|
||||||
|
// beginning of the interval, of the child interval with
|
||||||
|
// the given name, if found, or -1 if the interval is
|
||||||
|
// not found.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
double CMetaInterval::
|
||||||
|
get_interval_start_time(const string &name) const {
|
||||||
|
recompute();
|
||||||
|
Defs::const_iterator di;
|
||||||
|
for (di = _defs.begin(); di != _defs.end(); ++di) {
|
||||||
|
const IntervalDef &def = (*di);
|
||||||
|
|
||||||
|
bool match = false;
|
||||||
|
switch (def._type) {
|
||||||
|
case DT_c_interval:
|
||||||
|
match = (def._c_interval->get_name() == name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_ext_index:
|
||||||
|
match = (def._ext_name == name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (match) {
|
||||||
|
// Here's the interval.
|
||||||
|
return int_to_double_time(def._actual_begin_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: CMetaInterval::get_interval_end_time
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns the actual end time, relative to the
|
||||||
|
// beginning of the interval, of the child interval with
|
||||||
|
// the given name, if found, or -1 if the interval is
|
||||||
|
// not found.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
double CMetaInterval::
|
||||||
|
get_interval_end_time(const string &name) const {
|
||||||
|
recompute();
|
||||||
|
Defs::const_iterator di;
|
||||||
|
for (di = _defs.begin(); di != _defs.end(); ++di) {
|
||||||
|
const IntervalDef &def = (*di);
|
||||||
|
|
||||||
|
bool match = false;
|
||||||
|
double duration = 0.0;
|
||||||
|
switch (def._type) {
|
||||||
|
case DT_c_interval:
|
||||||
|
duration = def._c_interval->get_duration();
|
||||||
|
match = (def._c_interval->get_name() == name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DT_ext_index:
|
||||||
|
duration = def._ext_duration;
|
||||||
|
match = (def._ext_name == name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (match) {
|
||||||
|
// Here's the interval.
|
||||||
|
return int_to_double_time(def._actual_begin_time) + duration;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1.0;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CMetaInterval::initialize
|
// Function: CMetaInterval::initialize
|
||||||
// Access: Published, Virtual
|
// Access: Published, Virtual
|
||||||
|
@ -57,6 +57,11 @@ PUBLISHED:
|
|||||||
double rel_time, RelativeStart rel_to);
|
double rel_time, RelativeStart rel_to);
|
||||||
int pop_level();
|
int pop_level();
|
||||||
|
|
||||||
|
bool set_interval_start_time(const string &name, double rel_time,
|
||||||
|
RelativeStart rel_to = RS_level_begin);
|
||||||
|
double get_interval_start_time(const string &name) const;
|
||||||
|
double get_interval_end_time(const string &name) const;
|
||||||
|
|
||||||
enum DefType {
|
enum DefType {
|
||||||
DT_c_interval,
|
DT_c_interval,
|
||||||
DT_ext_index,
|
DT_ext_index,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user