/* abs@well.com */ #include #include #include #include #include #include /* IAC CODE CHANGE : #include */ #include /* To avoid obfuscating the code, put in a fixed polyhedron size */ #define MAX_PLIST_SIZE 1000000 AVSinit_modules() { int AC_palms(); AVSmodule_from_desc(AC_palms); } int AC_palms() { int AC_palms_compute(); int in_port1; int in_port2; /* Set the module name and type */ AVSset_module_name("palms", MODULE_MAPPER); /* Input Port Specifications */ in_port1 = AVScreate_input_port("stream", "field 1D 2-space float", REQUIRED); /* Create an output port for the result */ AVScreate_output_port("Geometry", "geom"); AVSadd_float_parameter("major_radius", 2.0, 0.001, 1000.0); AVSadd_float_parameter("minor_radius", 1.0, 0.001, 1000.0); AVSadd_parameter("major_facets","integer",4,3,INT_UNBOUND); AVSadd_parameter("minor_facets","integer",4,3,INT_UNBOUND); AVSadd_float_parameter("scale", 1.0, 0.0, 1000.0); AVSadd_float_parameter("z_offset", 0.0, 0.0, 1000.0); AVSadd_float_parameter("start_red", 1.0, 0.0, 1.0); AVSadd_float_parameter("start_green", 0.0, 0.0, 1.0); AVSadd_float_parameter("start_blue", 0.0, 0.0, 1.0); AVSadd_float_parameter("finish_red", 0.0, 0.0, 1.0); AVSadd_float_parameter("finish_green", 1.0, 0.0, 1.0); AVSadd_float_parameter("finish_blue", 0.0, 0.0, 1.0); /* Tell avs what subroutine to call to do the compute */ AVSset_compute_proc(AC_palms_compute); } int AC_palms_compute(AVSfield_float *stream, GEOMedit_list *output, float *major_radius, float *minor_radius, int major_facets, int minor_facets, float *scale, float *z_offset, float *start_red, float *start_green, float *start_blue, float *finish_red, float *finish_green, float *finish_blue) { GEOMobj *obj; float theta, max_theta, delta, old_theta; int index, flags, cindex; float r, g, b; float factor; float pi = 4.0*atan(1.0); float major_angle = 2.0*pi/(float)major_facets; float minor_angle = 2.0*pi/(float)minor_facets; int major_i, minor_i, nnn, ppp, p1, p2, p3, p4; float major_a, minor_a; float vertex[MAX_PLIST_SIZE][3]; float colors[MAX_PLIST_SIZE][3]; int numverts; int plist[MAX_PLIST_SIZE]; float x, y, z; float _x_offset, _y_offset; double atan(); double sin(); double cos(); char type[100]; int prim_data[MAX_PLIST_SIZE]; register int i, k; int n, pind; register int *vertex_data; int flag; FILE *f; int facet; int dims[99]; float *fp1; int num; float *fa1; #ifdef DEBUG fprintf(stderr, "*major_radius = %f\n", *major_radius); fprintf(stderr, "*minor_radius = %f\n", *minor_radius); fprintf(stderr, "major_facets = %d\n", major_facets); fprintf(stderr, "minor_facets = %d\n", minor_facets); fprintf(stderr, "major_angle = %f\n", major_angle); fprintf(stderr, "minor_angle = %f\n", minor_angle); fprintf(stderr, "*scale = %f\n", *scale); fprintf(stderr, "*z_offset = %f\n", *z_offset); fprintf(stderr, "*start_red = %f\n", *start_red); fprintf(stderr, "*finish_red = %f\n", *finish_red); #endif DEBUG r = 0.0; g = 1.0; b = 1.0; numverts = major_facets*minor_facets; #ifdef DEBUG fprintf(stderr, "checkpoint #1\n"); #endif DEBUG AVSfield_get_dimensions(stream, dims); fa1 = AVSfield_points_ptr(stream); ppp = 0; for (num = 0; num < dims[0]; num++) { nnn = 0; fp1 = I1DV(stream, num); for (major_i = 0; major_i < major_facets; major_i++) { for (minor_i = 0; minor_i < minor_facets; minor_i++) { major_a = major_angle*(float)major_i; minor_a = minor_angle*(float)minor_i; #ifdef DEBUG fprintf(stderr, "major_a = %f\n", major_a); fprintf(stderr, "cos(major_a) = %f\n", cos(major_a)); fprintf(stderr, "sin(major_a) = %f\n", sin(major_a)); fprintf(stderr, "minor_a = %f\n", minor_a); fprintf(stderr, "cos(minor_a) = %f\n", cos(minor_a)); fprintf(stderr, "sin(minor_a) = %f\n", sin(minor_a)); #endif DEBUG x = (*major_radius) + (*minor_radius)*(float)cos(minor_a); y = 0.0; z = (*minor_radius)*(float)sin(minor_a); #ifdef DEBUG fprintf(stderr, "temp x = %f\n", x); fprintf(stderr, "temp y = %f\n", y); fprintf(stderr, "temp z = %f\n", z); #endif DEBUG /* I used to understand this */ y = x*(float)sin(major_a); x = x*(float)cos(major_a); #ifdef DEBUG fprintf(stderr, "x = %f\n", x); fprintf(stderr, "y = %f\n", y); fprintf(stderr, "z = %f\n", z); #endif DEBUG _x_offset = fa1[num]; _y_offset = fa1[dims[0] + num]; vertex[nnn + num*numverts][0] = x*(*scale)*fp1[0] + _x_offset; vertex[nnn + num*numverts][1] = y*(*scale)*fp1[0] + _y_offset; vertex[nnn + num*numverts][2] = z*(*scale)*fp1[0] + *z_offset; factor = (float)num / (float)(dims[0] - 1); colors[nnn + num*numverts][0] = factor*(*start_red) + (1.0 - factor)*(*finish_red); colors[nnn + num*numverts][1] = factor*(*start_green) + (1.0 - factor)*(*finish_green); colors[nnn + num*numverts][2] = factor*(*start_blue) + (1.0 - factor)*(*finish_blue); #ifdef DEBUG fprintf(stderr, "vertex[%d][0] = %f\n", nnn + num*numverts, vertex[nnn + num*numverts][0]); fprintf(stderr, "vertex[%d][1] = %f\n", nnn + num*numverts, vertex[nnn + num*numverts][1]); fprintf(stderr, "vertex[%d][2] = %f\n", nnn + num*numverts, vertex[nnn + num*numverts][2]); fprintf(stderr, "colors[%d][0] = %f\n", nnn + num*numverts, colors[nnn + num*numverts][0]); fprintf(stderr, "colors[%d][1] = %f\n", nnn + num*numverts, colors[nnn + num*numverts][1]); fprintf(stderr, "colors[%d][2] = %f\n", nnn + num*numverts, colors[nnn + num*numverts][2]); #endif DEBUG /* plist */ p1 = ++nnn; p2 = p1 + 1; if (p2 > (major_i + 1)*minor_facets) { p2 = p2 - minor_facets; } p4 = p1 + minor_facets; if (p4 > major_facets*minor_facets) { p4 = p4 - major_facets*minor_facets; } p3 = p4 + 1; if (p3 > (major_i + 2)*minor_facets) { p3 = p3 - minor_facets; } if (p1 == major_facets*minor_facets) { p3 = p3 - minor_facets; } #ifdef DEBUG fprintf(stderr, "ppp = %d\n", ppp); #endif DEBUG plist[ppp++] = 4; plist[ppp++] = p1 + num*numverts; plist[ppp++] = p2 + num*numverts; plist[ppp++] = p3 + num*numverts; plist[ppp++] = p4 + num*numverts; } } } plist[ppp] = 0; #ifdef DEBUG fprintf(stderr, "checkpoint #2\n"); #endif DEBUG /* Create an empty polyhedron object */ obj = GEOMcreate_obj(GEOM_POLYHEDRON,NULL); #ifdef DEBUG fprintf(stderr, "checkpoint #3\n"); AVSfield_get_dimensions(stream, dims); fprintf(stderr, "field is %d long\n", dims[0]); fa1 = AVSfield_points_ptr(stream); for (num = 0; num < dims[0]; num++) { fprintf(stderr, "coord %d value %d is %f\n", num, 1, fa1[num]); fprintf(stderr, "coord %d value %d is %f\n", num, 2, fa1[dims[0] + num]); fprintf(stderr, "color %d value %d is %f\n", num, 1, factor*(*start_red) + (1.0 - factor)*(*finish_red)); fprintf(stderr, "color %d value %d is %f\n", num, 2, factor*(*start_green) + (1.0 - factor)*(*finish_green)); fprintf(stderr, "color %d value %d is %f\n", num, 3, factor*(*start_blue) + (1.0 - factor)*(*finish_blue)); } #endif DEBUG GEOMadd_vertices(obj,(float *)vertex,dims[0]*numverts,GEOM_COPY_DATA); GEOMadd_float_colors(obj, (float *)colors,dims[0]*numverts,GEOM_COPY_DATA); /* * Add the polygons, copying the data since we didn't allocate it * dynamically. If the concave option is passed, polygon can * contain concave polygons that will be handled properly when rendered */ flag = 0; GEOMadd_polygons(obj,plist,flag,GEOM_COPY_DATA); /* facet = GEOM_FACET_NORMALS; */ facet = 0; GEOMgen_normals(obj,facet); /*******************/ *output = GEOMinit_edit_list(*output); GEOMedit_geometry(*output,"palms",obj); GEOMdestroy_obj(obj); /* free the allocated space */ return(1); }