/// <summary> /// This procedure contains the user code. Input parameters are provided as regular arguments, /// Output parameters as ref arguments. You don't have to assign output parameters, /// they will have a default value. /// </summary> private void RunScript(bool reset, bool go, bool debug, int method, Mesh M, List <Point3d> P, double sR, double sI, double dR, double eR, double sensDist, double sensAng, ref object points, ref object vectors, ref object outMCol, ref object neigh, ref object neighCol, ref object sensors) { // <Custom code> // ............................................................................ // Stigmergy system /* * notes on code refactoring * * 2 main classes: * . Particle System (and a class Particle) * . Environment (Mesh with scalar and optional vector field) * * RunScript function structure: * * . check inputs & eventually bypass execution * . initialise Environment * . initialise Particle System * . Update live variables * . Update Particle System * . Update Environment * . Extract Output Geometries and Data * */ // return on null input if (M == null || P == null) { return; } // initialize on first execution or mesh change if (AS == null || M.Vertices.Count != ME.scalarField.Length) { // initialize particle system ME = new MeshEnvironment(M, dR, eR); AS = new AgentSystem(P, ME); } // restore initial values on reset if (reset) { // initialize particle system ME.RestoreScalarField(); AS = new AgentSystem(P, ME); } if (go) { // update runtime variables AS.seekRadius = sR; AS.seekIntensity = sI; AS.sensDist = sensDist; // old value 3.0 AS.sensAng = sensAng; ME.diffusionRate = (float)dR; ME.evaporationRate = (float)eR; // update simulation switch (method) { case 0: AS.UpdateRTree(); break; case 1: AS.UpdateJones(); break; } // update environment (diffusion + evaporation) ME.Update(); // update component Component.ExpireSolution(true); } // . . . . . . . extract geometries // particles positions and velocites AS.GetPointsVectors(out pts, out vecs); points = pts; vectors = vecs; // colored mesh outMCol = ME.GetColoredMesh(); // debug mode if (debug) { switch (method) { case 0: neigh = AS.GetNeighPts(); neighCol = AS.GetNeighBrightness(); break; case 1: sensors = AS.SensorsOut(); break; } } // ............................................................................ // </Custom code> }