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); }
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); } }