mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
219 lines
5.2 KiB
C++
219 lines
5.2 KiB
C++
// Filename: test_bam.cxx
|
|
// Created by: jason (13Jun00)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d-general@lists.sourceforge.net .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "pandabase.h"
|
|
#include "pnotify.h"
|
|
#include "dconfig.h"
|
|
|
|
#include "test_bam.h"
|
|
|
|
|
|
TypeHandle Person::_type_handle;
|
|
TypeHandle Parent::_type_handle;
|
|
TypeHandle Child::_type_handle;
|
|
|
|
ConfigureFn(config_util)
|
|
{
|
|
TypedObject::init_type();
|
|
ReferenceCount::init_type();
|
|
TypedReferenceCount::init_type();
|
|
init_system_type_handles();
|
|
FactoryParam::init_type();
|
|
Datagram::init_type();
|
|
TypedWritable::init_type();
|
|
WritableParam::init_type();
|
|
BamReaderParam::init_type();
|
|
TypedWritableReferenceCount::init_type();
|
|
|
|
Person::init_type();
|
|
Parent::init_type();
|
|
Child::init_type();
|
|
|
|
BamReader::get_factory()->register_factory(Person::get_class_type(), Person::make_person);
|
|
BamReader::get_factory()->register_factory(Parent::get_class_type(), Parent::make_parent);
|
|
BamReader::get_factory()->register_factory(Child::get_class_type(), Child::make_child);
|
|
}
|
|
|
|
void Person::
|
|
write_datagram(BamWriter* manager, Datagram &me)
|
|
{
|
|
//Write out name
|
|
me.add_string(_name);
|
|
//Write out gender
|
|
me.add_uint8(myGender);
|
|
manager->write_pointer(me, _bro);
|
|
manager->write_pointer(me, _sis);
|
|
}
|
|
|
|
TypedWritable* Person::
|
|
make_person(const FactoryParams ¶ms)
|
|
{
|
|
Person *me = new Person;
|
|
DatagramIterator scan;
|
|
BamReader *manager;
|
|
|
|
parse_params(params, scan, manager);
|
|
me->fillin(me, scan, manager);
|
|
return me;
|
|
}
|
|
|
|
void Person::
|
|
fillin(Person* me, DatagramIterator& scan, BamReader* manager)
|
|
{
|
|
_name = scan.get_string();
|
|
myGender = scan.get_uint8();
|
|
manager->read_pointer(scan);
|
|
manager->read_pointer(scan);
|
|
}
|
|
|
|
int Person::
|
|
complete_pointers(TypedWritable **p_list, BamReader *)
|
|
{
|
|
_bro = (p_list[0] == TypedWritable::Null) ? (Person*)NULL : DCAST(Person, p_list[0]);
|
|
_sis = (p_list[1] == TypedWritable::Null) ? (Person*)NULL : DCAST(Person, p_list[1]);
|
|
return 2;
|
|
}
|
|
|
|
void Person::
|
|
print_relationships(){
|
|
nout << "My name is " << _name << endl;
|
|
if (_bro != NULL)
|
|
nout << "My brother is " << _bro->name() << endl;
|
|
if (_sis != NULL)
|
|
nout << "My sister is " << _sis->name() << endl;
|
|
}
|
|
|
|
void Parent::
|
|
write_datagram(BamWriter* manager, Datagram &me)
|
|
{
|
|
Person::write_datagram(manager, me);
|
|
manager->write_pointer(me, _son);
|
|
manager->write_pointer(me, _daughter);
|
|
}
|
|
|
|
TypedWritable* Parent::
|
|
make_parent(const FactoryParams ¶ms)
|
|
{
|
|
Parent *me = new Parent;
|
|
DatagramIterator scan;
|
|
BamReader *manager;
|
|
|
|
parse_params(params, scan, manager);
|
|
me->fillin(me, scan, manager);
|
|
return me;
|
|
}
|
|
|
|
void Parent::
|
|
fillin(Parent* me, DatagramIterator& scan, BamReader* manager)
|
|
{
|
|
Person::fillin(me, scan, manager);
|
|
manager->read_pointer(scan);
|
|
manager->read_pointer(scan);
|
|
}
|
|
|
|
int Parent::
|
|
complete_pointers(TypedWritable *p_list, BamReader *manager)
|
|
{
|
|
int start = Person::complete_pointers(p_list, manager);
|
|
_son = (p_list[start] == TypedWritable::Null) ? (Child*)NULL : DCAST(Child, p_list[2]);
|
|
_daughter = (p_list[start+1] == TypedWritable::Null) ? (Child*)NULL : DCAST(Child, p_list[3]);
|
|
return start+2;
|
|
}
|
|
|
|
void Parent::
|
|
setSon(Child* son)
|
|
{
|
|
if (son->isMale()) _son = son;
|
|
}
|
|
void Parent::
|
|
setDaughter(Child* daughter)
|
|
{
|
|
if (!daughter->isMale()) _daughter = daughter;
|
|
}
|
|
|
|
|
|
void Parent::
|
|
print_relationships(){
|
|
Person::print_relationships();
|
|
if (_son != NULL)
|
|
nout << "My son is " << _son->name() << endl;
|
|
if (_daughter != NULL)
|
|
nout << "My daughter is " << _daughter->name() << endl;
|
|
}
|
|
|
|
void Child::
|
|
write_datagram(BamWriter* manager, Datagram &me)
|
|
{
|
|
Person::write_datagram(manager, me);
|
|
manager->write_pointer(me, _dad);
|
|
manager->write_pointer(me, _mom);
|
|
}
|
|
|
|
TypedWritable* Child::
|
|
make_child(const FactoryParams ¶ms)
|
|
{
|
|
Child *me = new Child;
|
|
DatagramIterator scan;
|
|
BamReader *manager;
|
|
|
|
parse_params(params, scan, manager);
|
|
me->fillin(me, scan, manager);
|
|
me->fillin(me, scan, manager);
|
|
|
|
return me;
|
|
}
|
|
|
|
void Child::
|
|
fillin(Child* me, DatagramIterator& scan, BamReader* manager)
|
|
{
|
|
Person::fillin(me, scan, manager);
|
|
manager->read_pointer(scan);
|
|
manager->read_pointer(scan);
|
|
}
|
|
|
|
int Child::
|
|
complete_pointers(TypedWritable ** p_list, BamReader *manager)
|
|
{
|
|
int start = Person::complete_pointers(p_list, manager);
|
|
_dad = (p_list[start] == TypedWritable::Null) ? (Parent*)NULL : DCAST(Parent, p_list[2]);
|
|
_mom = (p_list[start+1] == TypedWritable::Null) ? (Parent*)NULL : DCAST(Parent, p_list[3]);
|
|
return start+2;
|
|
}
|
|
|
|
|
|
void Child::
|
|
setFather(Parent* dad)
|
|
{
|
|
if (dad->isMale()) _dad = dad;
|
|
}
|
|
|
|
void Child::
|
|
setMother(Parent* mom)
|
|
{
|
|
if (!mom->isMale()) _mom = mom;
|
|
}
|
|
|
|
void Child::
|
|
print_relationships(){
|
|
Person::print_relationships();
|
|
if (_dad != NULL)
|
|
nout << "My dad is " << _dad->name() << endl;
|
|
if (_mom != NULL)
|
|
nout << "My mom is " << _mom->name() << endl;
|
|
}
|