M_Line3 M_LineRead3(AG_DataSource *ds) { M_Line3 L; L.p = M_ReadVector3(ds); L.d = M_ReadVector3(ds); L.t = M_ReadReal(ds); return (L); }
int M_PolyhedronRead(AG_DataSource *ds, M_Polyhedron *P) { Uint i, j; P->nv = (Uint)AG_ReadUint32(ds); P->ne = (Uint)AG_ReadUint32(ds); P->nf = (Uint)AG_ReadUint32(ds); if ((P->v = TryMalloc(P->nv*sizeof(M_Vector3))) == NULL || (P->e = TryMalloc(P->ne*sizeof(M_Halfedge))) == NULL || (P->f = TryMalloc(P->nf*sizeof(M_Facet))) == NULL) goto fail; /* Read vertices */ for (i = 0; i < P->nv; i++) P->v[i] = M_ReadVector3(ds); /* Read edges */ for (i = 0; i < P->ne; i+=2) { M_Halfedge *eHead = &P->e[i]; M_Halfedge *eTail = &P->e[i+1]; eHead->v = (Uint)AG_ReadUint32(ds); eTail->v = (Uint)AG_ReadUint32(ds); if (eHead->v >= P->nv || eTail->v >= P->nv) { AG_SetError("Edge%d: Bad vertex %d", i, eHead->v); goto fail; } eHead->f = (Uint)AG_ReadUint32(ds); eTail->f = (Uint)AG_ReadUint32(ds); if (eHead->f >= P->nf || eTail->f >= P->nf) { AG_SetError("Edge%d: Bad facet %d", i, eHead->f); goto fail; } eHead->oe = i+1; eTail->oe = i; } /* Read facets */ for (i = 0; i < P->nf; i++) { M_Facet *f = &P->f[i]; f->n = (Uint)AG_ReadUint8(ds); if ((f->e = TryMalloc(f->n*sizeof(Uint))) == NULL) { goto fail; } for (j = 0; j < f->n; j++) { f->e[j] = (Uint)AG_ReadUint32(ds); if (f->e[j] >= P->ne) { AG_SetError("Facet%d[%d]: Bad incident edge %d", i, j, f->e[j]); goto fail; } } } return (0); fail: return (-1); }
M_Circle3 M_CircleRead3(AG_DataSource *ds) { M_Circle3 C; C.p = M_ReadVector3(ds); C.r = M_ReadReal(ds); return (C); }