2 // writes xml tree format from internal objects
\r
8 char *str_append_token(char *str1, const char *str2)
\r
13 str = new char[strlen(str1)+strlen(str2)+2];
\r
14 sprintf(str, "%s %s", str1, str2);
\r
19 str = new char[strlen(str2)+1];
\r
25 void str_from_float(char *buf, float f)
\r
27 if(f == (int)f) sprintf(buf, "%i", (int)f);
\r
28 else sprintf(buf, "%f", f);
\r
31 void Patch_XMLWrite(patchMesh_t *pPatch, xmlNodePtr surface)
\r
39 node = xmlNewChild(surface, NULL, (xmlChar *)"shader", (xmlChar *)pPatch->pShader->getName());
\r
43 for(i=0; i<pPatch->width; i++)
\r
45 for(j=0; j<pPatch->height; j++)
\r
47 str_from_float(buf, pPatch->ctrl[i][j].xyz[0]);
\r
48 str = str_append_token(str, buf);
\r
49 str_from_float(buf, pPatch->ctrl[i][j].xyz[1]);
\r
50 str = str_append_token(str, buf);
\r
51 str_from_float(buf, pPatch->ctrl[i][j].xyz[2]);
\r
52 str = str_append_token(str, buf);
\r
53 str_from_float(buf, pPatch->ctrl[i][j].st[0]);
\r
54 str = str_append_token(str, buf);
\r
55 str_from_float(buf, pPatch->ctrl[i][j].st[1]);
\r
56 str = str_append_token(str, buf);
\r
60 node = xmlNewChild(surface, NULL, (xmlChar *)"matrix", (xmlChar *)str);
\r
62 sprintf(buf, "%i", pPatch->width);
\r
63 xmlSetProp(node, (xmlChar *)"width", (xmlChar *)buf);
\r
64 sprintf(buf, "%i", pPatch->height);
\r
65 xmlSetProp(node, (xmlChar *)"height", (xmlChar *)buf);
\r
68 void Face_XMLWrite (face_t *face, xmlNodePtr surface, bool bAlternateTexdef = false)
\r
76 node = xmlNewChild(surface, NULL, (xmlChar *)"shader", (xmlChar *)face->texdef.GetName());
\r
80 for (i=0 ; i<3 ; i++)
\r
82 for (j=0 ; j<3 ; j++)
\r
84 str_from_float(buf, face->planepts[i][j]);
\r
85 str = str_append_token(str, buf);
\r
89 node = xmlNewChild(surface, NULL, (xmlChar *)"planepts", (xmlChar *)str);
\r
92 if(!bAlternateTexdef)
\r
95 sprintf(buf, "%i", (int)face->texdef.shift[0]);
\r
96 str = str_append_token(NULL, buf);
\r
97 sprintf(buf, "%i", (int)face->texdef.shift[1]);
\r
98 str = str_append_token(str, buf);
\r
99 sprintf(buf, "%i", (int)face->texdef.rotate);
\r
100 str = str_append_token(str, buf);
\r
101 sprintf(buf, "%f", face->texdef.scale[0]);
\r
102 str = str_append_token(str, buf);
\r
103 sprintf(buf, "%f", face->texdef.scale[1]);
\r
104 str = str_append_token(str, buf);
\r
106 node = xmlNewChild(surface, NULL, (xmlChar *)"texdef", (xmlChar *)str);
\r
111 // write matrix texdef
\r
113 for (i=0 ; i<2 ; i++)
\r
115 for (j=0 ; j<3 ; j++)
\r
117 str_from_float(buf, face->brushprimit_texdef.coords[i][j]);
\r
118 str = str_append_token(str, buf);
\r
121 node = xmlNewChild(surface, NULL, (xmlChar *)"bpmatrix", (xmlChar *)str);
\r
126 sprintf(buf, "%i", face->texdef.contents);
\r
127 str = str_append_token(NULL, buf);
\r
128 sprintf(buf, "%i", face->texdef.flags);
\r
129 str = str_append_token(str, buf);
\r
130 sprintf(buf, "%i", face->texdef.value);
\r
131 str = str_append_token(str, buf);
\r
133 node = xmlNewChild(surface, NULL, (xmlChar *)"flags", (xmlChar *)str);
\r
137 void Brush_XMLWrite (brush_t *brush, xmlNodePtr primitive)
\r
141 for(face_t *face = brush->brush_faces; face != NULL; face = face->next)
\r
143 node = xmlNewChild(primitive, NULL, (xmlChar *)"plane", NULL);
\r
144 Face_XMLWrite (face, node, brush->bBrushDef);
\r
148 void Epair_XMLWrite(epair_t *pEpair, xmlNodePtr epair)
\r
150 xmlSetProp(epair, (xmlChar *)"key", (xmlChar *)pEpair->key);
\r
151 xmlSetProp(epair, (xmlChar *)"value", (xmlChar *)pEpair->value);
\r
154 void Entity_XMLWrite(entity_t *pEntity, xmlNodePtr entity)
\r
160 CPtrArray *brushes = (CPtrArray*)pEntity->pData;
\r
162 for(pEpair = pEntity->epairs; pEpair != NULL; pEpair = pEpair->next)
\r
164 node = xmlNewChild(entity, NULL, (xmlChar *)"epair", NULL);
\r
165 Epair_XMLWrite(pEpair, node);
\r
168 for(int i=0; i<brushes->GetSize(); i++)
\r
170 pBrush = (brush_t*)brushes->GetAt(i);
\r
172 if(pBrush->patchBrush)
\r
174 node = xmlNewChild(entity, NULL, (xmlChar *)"patch", NULL);
\r
175 Patch_XMLWrite(pBrush->pPatch, node);
\r
179 node = xmlNewChild(entity, NULL, (xmlChar *)"brush", NULL);
\r
180 Brush_XMLWrite(pBrush, node);
\r
185 void Map_XMLWrite (CPtrArray *map, xmlNodePtr map_node)
\r
190 for(int i=0; i<map->GetSize(); i++)
\r
192 pEntity = (entity_t*)map->GetAt(i);
\r
194 node = xmlNewChild(map_node, NULL, (xmlChar *)"entity", NULL);
\r
195 Entity_XMLWrite(pEntity, node);
\r
199 void Map_Write (CPtrArray *map, IDataStream *out)
\r
204 xmlDocPtr doc = xmlNewDoc((xmlChar *)"1.0");
\r
205 xmlCreateIntSubset(doc, (xmlChar *)"mapq3", NULL, (xmlChar *)"mapq3.dtd");
\r
206 doc->children->next = xmlNewDocNode(doc, NULL, (xmlChar *)"mapq3", NULL);
\r
208 Map_XMLWrite(map, doc->children->next);
\r
210 // xmlDocDumpMemory(doc, &buf, &len);
\r
211 xmlDocDumpFormatMemory(doc, &buf, &len, 1);
\r
214 out->Write(buf, len);
\r