/** * Import an superellipsoid/sphere from the database format to the * internal structure. Apply modeling transformations as wsuperell. */ int rt_superell_import4(struct rt_db_internal *ip, const struct bu_external *ep, const fastf_t *mat, const struct db_i *dbip) { struct rt_superell_internal *eip; union record *rp; fastf_t vec[3*4 + 2]; if (dbip) RT_CK_DBI(dbip); BU_CK_EXTERNAL(ep); rp = (union record *)ep->ext_buf; /* Check record type */ if (rp->u_id != ID_SOLID) { bu_log("rt_superell_import4(): defective record\n"); return -1; } RT_CK_DB_INTERNAL(ip); ip->idb_major_type = DB5_MAJORTYPE_BRLCAD; ip->idb_type = ID_SUPERELL; ip->idb_meth = &OBJ[ID_SUPERELL]; BU_ALLOC(ip->idb_ptr, struct rt_superell_internal); eip = (struct rt_superell_internal *)ip->idb_ptr; eip->magic = RT_SUPERELL_INTERNAL_MAGIC; /* Convert from database to internal format */ flip_fastf_float(vec, rp->s.s_values, 4, dbip->dbi_version < 0 ? 1 : 0); /* Apply modeling transformations */ if (mat == NULL) mat = bn_mat_identity; MAT4X3PNT(eip->v, mat, &vec[0*3]); MAT4X3VEC(eip->a, mat, &vec[1*3]); MAT4X3VEC(eip->b, mat, &vec[2*3]); MAT4X3VEC(eip->c, mat, &vec[3*3]); if (dbip->dbi_version < 0) { eip->n = flip_dbfloat(rp->s.s_values[12]); eip->e = flip_dbfloat(rp->s.s_values[13]); } else { eip->n = rp->s.s_values[12]; eip->e = rp->s.s_values[13]; } return 0; /* OK */ }
/** * R T _ P G _ I M P O R T * * Read all the polygons in as a complex dynamic structure. * The caller is responsible for freeing the dynamic memory. * (vid rt_pg_ifree). */ int rt_pg_import4(struct rt_db_internal *ip, const struct bu_external *ep, const fastf_t *mat, const struct db_i *dbip) { struct rt_pg_internal *pgp; union record *rp; size_t i; size_t rno; /* current record number */ size_t p; /* current polygon index */ if (dbip) RT_CK_DBI(dbip); BU_CK_EXTERNAL(ep); rp = (union record *)ep->ext_buf; if (rp->u_id != ID_P_HEAD) { bu_log("rt_pg_import4: defective header record\n"); return -1; } RT_CK_DB_INTERNAL(ip); ip->idb_major_type = DB5_MAJORTYPE_BRLCAD; ip->idb_type = ID_POLY; ip->idb_meth = &rt_functab[ID_POLY]; BU_ALLOC(ip->idb_ptr, struct rt_pg_internal); pgp = (struct rt_pg_internal *)ip->idb_ptr; pgp->magic = RT_PG_INTERNAL_MAGIC; pgp->npoly = (ep->ext_nbytes - sizeof(union record)) / sizeof(union record); if (pgp->npoly <= 0) { bu_log("rt_pg_import4: polysolid with no polygons!\n"); return -1; } if (pgp->npoly) pgp->poly = (struct rt_pg_face_internal *)bu_malloc( pgp->npoly * sizeof(struct rt_pg_face_internal), "rt_pg_face_internal"); pgp->max_npts = 0; if (mat == NULL) mat = bn_mat_identity; for (p=0; p < pgp->npoly; p++) { struct rt_pg_face_internal *pp; pp = &pgp->poly[p]; rno = p+1; if (rp[rno].q.q_id != ID_P_DATA) { bu_log("rt_pg_import4: defective data record\n"); return -1; } pp->npts = rp[rno].q.q_count; pp->verts = (fastf_t *)bu_malloc(pp->npts * 3 * sizeof(fastf_t), "pg verts[]"); pp->norms = (fastf_t *)bu_malloc(pp->npts * 3 * sizeof(fastf_t), "pg norms[]"); for (i=0; i < pp->npts; i++) { point_t pnt; vect_t vec; if (dbip->dbi_version < 0) { flip_fastf_float(pnt, rp[rno].q.q_verts[i], 1, 1); flip_fastf_float(vec, rp[rno].q.q_norms[i], 1, 1); } else { VMOVE(pnt, rp[rno].q.q_verts[i]); VMOVE(vec, rp[rno].q.q_norms[i]); } /* Note: side effect of importing dbfloat_t */ MAT4X3PNT(&pp->verts[i*3], mat, pnt); MAT4X3VEC(&pp->norms[i*3], mat, vec); } if (pp->npts > pgp->max_npts) pgp->max_npts = pp->npts; } if (pgp->max_npts < 3) { bu_log("rt_pg_import4: polysolid with all polygons of less than %zu vertices!\n", pgp->max_npts); /* XXX free storage */ return -1; } return 0; }