POV-Ray : Newsgroups : povray.general : recursively defined objects and memory : Re: recursively defined objects and memory Server Time
29 Jul 2024 10:22:56 EDT (-0400)
  Re: recursively defined objects and memory  
From: Ger Remmers
Date: 18 Aug 2013 18:01:22
Message: <52114432$1@news.povray.org>
On 08/18/2013 04:48 PM, clipka wrote:
> Am 18.08.2013 23:08, schrieb Ger Remmers:
>
>> (*) Povray seems to have a problem with very large arrays. I  can go as
>> high as 800K nodes, after that the last position in the array seems to
>> get corrupted.
>
> Obviously that shouldn't happen. Can you provide a sample scene to
> reproduce, dissect and debug the problem?
>

It messes up in the WriteDataFile() macro

#declare DataFilename = "nodes.inc";

#macro WriteDataFile()

   #fopen DataFile DataFilename write
   #write( DataFile, "#declare NumberOfNodes = 
",str(NumberOfNodes,0,0),";\n")
   #write( DataFile, "#declare Nodes =array [NumberOfNodes]\n")
   #write( DataFile, "{\n")
   #for (NodeCount, 0, NumberOfNodes -2, 1)
       #write ( DataFile, "<",vstr(3, Nodes[NodeCount],",",0,-1),">,\n")
   #end

/*
When including the written data it turns out that the next line is not 
executed
*/
   #write ( DataFile, "<",vstr(3, Nodes[NumberOfNodes-1],",",0,-1),">\n")
   #write (DataFile,"}\n")
   #fclose DataFile

   #debug concat("Done writing data file with ",str(NumberOfNodes,0,0)," 
nodes for frame ",str(frame_number,0,0),"\n")
#end


/*
   Only at the first frame do we need to initialize the nodes on the sphere,
   after that we load the node data from disk.
*/

#if (frame_number = 1)
   #declare NumberOfNodes = 5000000;

/*
With NumberOfNodes < ~800K it works fine
*/
   #declare Nodes =array [NumberOfNodes];
   #declare dlong = pi * (3-sqrt(5));
   #declare dz = 2.0 / NumberOfNodes;
   #declare Longitude = 0;
   #declare Z = 1 - dz / 2;

   #for (NodeCount, 0, NumberOfNodes - 1, 1)
     #declare Radius = sqrt(1 - Z * Z);
     #declare Nodes[NodeCount] = <cos(Longitude)* Radius, sin(Longitude) 
* Radius, Z>;
     #declare Z = Z - dz;
     #declare Longitude = Longitude + dlong;
   #end

   #else
     #include DataFilename
#end

#declare NumberOfItterations = 5;
#declare RandAngle = seed(66);
#if (frame_number > 1)
   #for(Dummy,0, (frame_number - 1) * NumberOfItterations * 4,1)
     #declare PlaneAngle = rand(RandAngle);
   #end
#end
#declare PlaneAngle = rand(RandAngle);
#declare CuttingPlane = plane{y, 0};
//#declare Cutter = box {<-10, 0.0, -10>,<10, -10, 10>};

#macro AdjustNodes(AngleX, AngleY, AngleZ, Displacement)
   #declare Cut = object { CuttingPlane translate y * Displacement 
rotate <AngleX, AngleY, AngleZ> };
   #for (NodeCount, 0, NumberOfNodes - 1, 1)
     #if (inside (Cut, Nodes[NodeCount]))
       #declare Nodes[NodeCount] = Nodes[NodeCount] / 1.001;
     #else
       #declare Nodes[NodeCount] = Nodes[NodeCount] * 1.001;
     #end
   #end
#end

   #for (ItterationCount, 0, NumberOfItterations - 1, 1)
   #declare PlaneAngleX = rand(RandAngle) * 360;
   #declare PlaneAngleY = rand(RandAngle) * 360;
   #declare PlaneAngleZ = rand(RandAngle) * 360;
   #declare Displacement = 0.5 - rand(RandAngle);
//  #local Cut = object { CuttingPlane rotate PlaneAngle };
   AdjustNodes(PlaneAngleX, PlaneAngleY, PlaneAngleZ, Displacement)
//    #debug concat(str(PlaneAngle,0,0),"\n")
#end
WriteDataFile()

-- 
Cheers
Ger


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.