better pipelined animation (still needs work)

This commit is contained in:
David Rose 2006-02-15 21:44:08 +00:00
parent c251c7c484
commit 11337e4c20
4 changed files with 26 additions and 7 deletions

View File

@ -42,6 +42,7 @@
#include "textureContext.h"
#include "shaderExpansion.h"
#include "shaderContext.h"
#include "transformBlend.h"
#include "transformBlendTable.h"
#include "transformTable.h"
#include "userVertexSlider.h"
@ -255,6 +256,7 @@ ConfigureFn(config_gobj) {
TextureStage::init_type();
ShaderExpansion::init_type();
ShaderContext::init_type();
TransformBlend::init_type();
TransformBlendTable::init_type();
TransformTable::init_type();
UserVertexSlider::init_type();

View File

@ -212,7 +212,7 @@ INLINE void TransformBlend::
update_blend() const {
CDReader cdata(_cycler);
if (cdata->_global_modified != VertexTransform::get_global_modified()) {
CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata);
CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata, false);
((TransformBlend *)this)->recompute_result(cdataw);
}
}
@ -295,7 +295,7 @@ INLINE UpdateSeq TransformBlend::
get_modified() const {
CDReader cdata(_cycler);
if (cdata->_global_modified != VertexTransform::get_global_modified()) {
CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata);
CDWriter cdataw(((TransformBlend *)this)->_cycler, cdata, false);
((TransformBlend *)this)->recompute_result(cdataw);
return cdataw->_modified;
} else {

View File

@ -21,6 +21,7 @@
#include "bamReader.h"
#include "bamWriter.h"
TypeHandle TransformBlend::_type_handle;
////////////////////////////////////////////////////////////////////
// Function: TransformBlend::compare_to
@ -201,7 +202,7 @@ write(ostream &out, int indent_level) const {
// VertexTransform objects, if necessary.
////////////////////////////////////////////////////////////////////
void TransformBlend::
recompute_result(TransformBlend::CDWriter &cdata) {
recompute_result(CData *cdata) {
// Update the global_modified sequence number first, to prevent race
// conditions.
cdata->_global_modified = VertexTransform::get_global_modified();
@ -235,7 +236,7 @@ recompute_result(TransformBlend::CDWriter &cdata) {
////////////////////////////////////////////////////////////////////
void TransformBlend::
clear_result() {
CDWriter cdata(_cycler);
CDWriter cdata(_cycler, true);
cdata->_global_modified = UpdateSeq();
if (cdata->_modified != UpdateSeq()) {
cdata->_modified = UpdateSeq();

View File

@ -82,6 +82,11 @@ PUBLISHED:
void write(ostream &out, int indent_level) const;
private:
class CData;
void recompute_result(CData *cdata);
void clear_result();
class TransformEntry {
public:
INLINE bool operator < (const TransformEntry &other) const;
@ -99,6 +104,9 @@ private:
INLINE CData();
INLINE CData(const CData &copy);
virtual CycleData *make_copy() const;
virtual TypeHandle get_parent_type() const {
return TransformBlend::get_class_type();
}
LMatrix4f _result;
UpdateSeq _modified;
@ -109,15 +117,23 @@ private:
typedef CycleDataReader<CData> CDReader;
typedef CycleDataWriter<CData> CDWriter;
void recompute_result(CDWriter &cdata);
void clear_result();
public:
void write_datagram(BamWriter *manager, Datagram &dg) const;
int complete_pointers(TypedWritable **plist, BamReader *manager);
void fillin(DatagramIterator &scan, BamReader *manager);
friend class VertexTransform;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
register_type(_type_handle, "TransformBlend");
}
private:
static TypeHandle _type_handle;
};
INLINE ostream &operator << (ostream &out, const TransformBlend &obj);