SVAS is an alife 3d virtual enviroment with physic laws, and a distributed design.
There are four important distributed parts on the server: we have on one side the grand master, CommCenter, that controls the flow of execution, and then we have clients, each of them is executed in parallel, using threads; they are Client, ControlClient and GraphicClient, and all them are subclasses from BaseClient. Client is the class that controls the agents.
SVAS is really only the server, so you only need to compile it.
A plain Makefile is included, so using the un*x command make is enought, anyway if you compile it on another platform you only need to note that svas_server uses the libcommonc++ libraries, so look what they need on your platform, and just compile svas_server with libcommonc++
There is also a graphic client, made with Qt/KDE 3.0/OpenGL in the LiNUX platform, and a set of utilities made in Python that can be used to display the world status with POVray raytracer.
You need also at least one agent client if you want to make something; there is a library made with python to help making agents, and some examples are provided too.
Reading the code
As SVAS is a full virtual enviroment it have lots of different areas, as the physics, the communication, the world as container...
The easiest way to comprehend the system id to look at it as a succesion of cycles, and then look a what one cycle does.
A World Step
First of all there are several threads of execution, the first is the control one, that controls the creation of new threads (clients), and checks when them have finished their works to begin the physic simulation.
While this check is being done, the other threads are receiving data and only writting in the Cylinder::desiredAction attribute, so no need of mutex nor any other type of synchronization is needed. Of course they can read as much as they want, and when they end the decrease the atomic counter that Wold::numClients is.
Then, when all them finish, the physic simulation takes place.
The physic simulation is done in the World class and on the Cylinder one, using Collision.
First at World::step() we begin the cycle, making the cylinders to Cylinder::performActions() in the Cylinder::newCyle() method, then we make one World::step(0,1), and it get subdivided if there is any collision, if there is, we Cylinder::undoVelocity(), and make one of the Collision::resolve() variants. So on until time is small enought (COLLISION_TIME_EPSILUM), or no collision is left... Contacts are solved too, but they do not need to be solved until the end.
This program is being developed by David Moreno, who can be contacted at email@example.com. There is a project page at http://savannah.gnu.org/projects/svas, and a CVS repository that can be accesed at subversions.gnu.org:/cvsroot/svas, http://savannah.gnu.org/cgi-bin/viewcvs/svas/.
svas_server -- virtual World Server of Svas Copyright (c) 2001, 2002 David Moreno Montero
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.