###################################
#
#
package PDL::Graphics::TriD::Object;
use strict;
use fields qw(Objects ValidList ChangedSub List VRML);
sub new{
my $class = shift;
my $self = fields::new($class);
$self;
}
sub clear_objects {
my($this) = @_;
$this->{Objects} = [];
$this->{ValidList} = 0;
}
sub delete_object {
my($this,$object) = @_;
return unless(defined $object && defined $this->{Objects});
for(0..$#{$this->{Objects}}){
if($object == $this->{Objects}[$_]){
splice(@{$this->{Objects}},$_,1);
redo;
}
}
}
# XXXXXXXXX sub {} makes all these objects and this window immortal!
sub add_object {
my($this,$object) = @_;
push @{$this->{Objects}},$object;
$this->{ValidList} = 0;
for(@{$this->{ChangedSub}}) {
$object->add_changedsub($_);
}
if($this->i_keep_list) {
$object->add_changedsub(sub {$this->changed_from_above()});
}
}
sub changed_from_above {
my($this) = @_;
print "CHANGED_FROM_ABOVE\n" if $PDL::Graphics::TriD::verbose;
$this->changed();
}
sub add_changedsub {
my($this,$chsub) = @_;
push @{$this->{ChangedSub}}, $chsub;
for (@{$this->{Objects}}) {
$_->add_changedsub($chsub);
}
}
sub clear {
my($this) = @_;
# print "Clear: $this\n";
for(@{$this->{Objects}}) {
$_->clear();
}
$this->delete_displist();
delete $this->{ChangedSub};
delete $this->{Objects};
}
sub changed {
my($this) = @_;
print "VALID0 $this\n" if $PDL::Graphics::TriD::verbose;
$this->{ValidList} = 0;
for(@{$this->{ChangedSub}}) {
&$_($this);
}
}
sub i_keep_list {
return 0;
}
sub vrml_update {
my ($this) = @_;
use PDL::Graphics::VRML;
$this->{VRML} = new PDL::Graphics::VRMLNode('Transform',
'translation' => "-1 -1 -1",
'scale' => "2 2 2");
$this->{ValidList} = 1;
}
sub tovrml {
my($this) = @_;
print ref($this)," valid=",$this->{ValidList}," tovrml\n";
if (!$this->{ValidList}) {
$this->vrml_update();
}
$this->{VRML}->add('children',
[map {$_->tovrml()} @{$this->{Objects}}]);
}
1;