###################################
#
#
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;
