Exemple #1
0
static void build_line_set(GF_Node *node, Drawable3D *stack, GF_TraverseState *tr_state)
{
	u32 i, j, c_idx;
	GenMFField *cols;
	GF_Vertex vx;
	Bool rgba_col;
	SFColorRGBA rgba;
	X_LineSet *p = (X_LineSet *)node;
	X_Coordinate *c = (X_Coordinate *) p->coord;

	stack->mesh->mesh_type = MESH_LINESET;

	cols = NULL;
	rgba_col = 0;
	if (p->color) {
		if (gf_node_get_tag(p->color)==TAG_X3D_ColorRGBA) {
			rgba_col = 1;
			cols = (GenMFField *) & ((X_ColorRGBA *) p->color)->color;
		} else {
			cols = (GenMFField *) & ((M_Color *) p->color)->color;
		}
	}
	c_idx = 0;
	memset(&vx, 0, sizeof(GF_Vertex));
	for (i=0; i<p->vertexCount.count; i++) {
		if (p->vertexCount.vals[i]<2) continue;

		for (j=0; j<(u32) p->vertexCount.vals[i]; j++) {
			vx.pos = c->point.vals[c_idx];
			if (cols && (cols->count>c_idx)) {
				if (rgba_col) {
					rgba = ((MFColorRGBA *)cols)->vals[c_idx];
				} else {
					rgba = gf_sg_sfcolor_to_rgba( ((MFColor *)cols)->vals[c_idx]);
				}
				vx.color = MESH_MAKE_COL(rgba);
			}
			mesh_set_vertex_vx(stack->mesh, &vx);
			if (j) {
				mesh_set_index(stack->mesh, stack->mesh->v_count-2);
				mesh_set_index(stack->mesh, stack->mesh->v_count-1);
			}
			c_idx++;
			if (c_idx==c->point.count) break;
		}
	}
	if (cols) stack->mesh->flags |= MESH_HAS_COLOR;
	mesh_update_bounds(stack->mesh);
}
Exemple #2
0
static void build_polypoint2d(GF_Node *node, Drawable3D *stack, GF_TraverseState *tr_state)
{
	u32 i;
	SFColorRGBA col;
	X_Polypoint2D *p = (X_Polypoint2D *)node;

	stack->mesh->mesh_type = MESH_POINTSET;
	col.red = col.green = col.blue = 0; col.alpha = FIX_ONE;
	for (i=0; i<p->point.count; i++) {
		mesh_set_point(stack->mesh, p->point.vals[i].x, p->point.vals[i].y, 0, col);
		mesh_set_index(stack->mesh, stack->mesh->v_count-1);
	}
}