// Write out LOD bool trpgLod::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPG_LOD); buf.Add(id); buf.Add(numRange); buf.Add(center); buf.Add(switchIn); buf.Add(switchOut); buf.Add(width); if ( name && strlen(name) ) { buf.Add(name); } else buf.Add(""); buf.End(); return true; }
bool trpgTexTable1_0::Write(trpgWriteBuffer &buf) { int32 numTex; if (!isValid()) return false; buf.Begin(TRPGTEXTABLE); numTex = textureMap.size(); buf.Add(numTex); TextureMapType::const_iterator itr = textureMap.begin(); for ( ; itr != textureMap.end( ); itr++) { trpgTexture1_0 tex1_0; tex1_0 = itr->second; if (!tex1_0.Write(buf)) return false; } buf.End(); return true; }
// Write method bool trpgLabelProperty::Write(trpgWriteBuffer &buf) { buf.Begin(TRPG_LABEL_PROPERTY); buf.Begin(TRPG_LABEL_PROPERTY_BASIC); buf.Add(fontId); buf.Add(supportId); buf.Add(type); buf.End(); buf.End(); return true; }
// Write method bool trpgSupportStyle::Write(trpgWriteBuffer &buf) { buf.Begin(TRPG_SUPPORT_STYLE); buf.Begin(TRPG_SUPPORT_STYLE_BASIC); buf.Add(type); buf.Add(matId); buf.End(); buf.End(); return true; }
// Write billboard bool trpgBillboard::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPG_BILLBOARD); buf.Add(numChild); buf.Add(id); buf.Add((uint8)type); buf.Add((uint8)mode); buf.Add(center); buf.Add(axis); if ( name && strlen(name) ) { buf.Add(name); } buf.End(); return true; }
// Write Attach node bool trpgChildRef::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPG_CHILDREF); buf.Add(lod); buf.Add(x); buf.Add(y); buf.Add(addr.file); buf.Add(addr.offset); buf.Add(zmin); buf.Add(zmax); buf.End(); return true; }
// Write Attach node bool trpgAttach::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPG_ATTACH); buf.Add(numChild); buf.Add(id); buf.Add(parentID); buf.Add(childPos); if ( name && strlen(name) ) { buf.Add(name); } buf.End(); return true; }
// Write transform bool trpgTransform::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPG_TRANSFORM); buf.Add(numChild); buf.Add(id); for (int i=0;i<4;i++) for (int j=0;j<4;j++) buf.Add(m[i][j]); if ( name && strlen(name) ) { buf.Add(name); } buf.End(); return true; }
bool trpgLocalMaterial::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPGLOCALMATERIAL); // Write the data buf.Add(baseMatTable); buf.Add(baseMat); buf.Add(sx); buf.Add(sy); buf.Add(ex); buf.Add(ey); buf.Add(destWidth); buf.Add(destHeight); buf.Add(addr[0].file); buf.Add(addr[0].offset); // and in case there's more... int numAddrs=(int)(addr.size()); if (numAddrs>1) { buf.Add(numAddrs-1); // suppressed due to breaking old readers. for (int i=1;i<numAddrs;i++) { buf.Add(addr[i].file); buf.Add(addr[i].offset); } } buf.End(); return true; }
// Write to a buffer bool trpgTileHeader::Write(trpgWriteBuffer &buf) { unsigned int i; if (!isValid()) return false; for (i=0;i<locMats.size();i++) if (!locMats[i].isValid()) return false; buf.Begin(TRPGTILEHEADER); buf.Begin(TRPG_TILE_MATLIST); buf.Add((int32)matList.size()); for (i=0;i<matList.size();i++) buf.Add(matList[i]); buf.End(); buf.Begin(TRPG_TILE_MODELLIST); buf.Add((int32)modelList.size()); for (i=0;i<modelList.size();i++) buf.Add(modelList[i]); buf.End(); buf.Begin(TRPG_TILE_DATE); buf.Add(date); buf.End(); buf.Begin(TRPG_TILE_LOCMATLIST); buf.Add((int32)locMats.size()); for (i=0;i<locMats.size();i++) locMats[i].Write(buf); buf.End(); buf.End(); return true; }
bool trpgLabel::Write(trpgWriteBuffer &buf) { unsigned int i; buf.Begin(TRPG_LABEL); buf.Add(propertyId); buf.Add(text); buf.Add(alignment); buf.Add(tabSize); buf.Add(scale); buf.Add(thickness); buf.Add(desc); buf.Add(url); buf.Add(location); buf.Add((int)supports.size()); for (i=0;i<supports.size();i++) buf.Add(supports[i]); buf.End(); return true; }
// Write out to a buffer bool trpgHeader::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPGHEADER); buf.Add((int32)verMajor); buf.Add((int32)verMinor); buf.Add((int32)dbVerMajor); buf.Add((int32)dbVerMinor); buf.Add(origin); buf.Add(sw); buf.Add(ne); buf.Add((uint8)tileType); buf.Add((int32)numLods); buf.Begin(TRPGHEAD_LODINFO); for (int i=0;i<numLods;i++) { buf.Add(lodSizes[i]); buf.Add(lodRanges[i]); buf.Add(tileSize[i]); } buf.End(); buf.Add(maxGroupID); if((verMajor >= TRPG_NOMERGE_VERSION_MAJOR) && (verMinor >=TRPG_NOMERGE_VERSION_MINOR)) { buf.Add(flags); buf.Add(rows); buf.Add(cols); } buf.End(); return true; }
// Write function bool trpgTextureEnv::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPGMAT_TEXENV); buf.Begin(TRPGMAT_TXENV_MODE); buf.Add(envMode); buf.End(); buf.Begin(TRPGMAT_TXENV_FILTER); buf.Add(minFilter); buf.Add(magFilter); buf.End(); buf.Begin(TRPGMAT_TXENV_WRAP); buf.Add(wrapS); buf.Add(wrapT); buf.End(); buf.Begin(TRPGMAT_TXENV_BORDER); buf.Add(borderCol); buf.End(); buf.End(); return true; }
// Write to buffer bool trpgMaterial::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPGMATERIAL); // Bundle the basic material parameters together buf.Begin(TRPGMAT_BASIC); buf.Add(color); buf.Add(ambient); buf.Add(diffuse); buf.Add(specular); buf.Add(emission); buf.Add(shininess); buf.Add(numTile); buf.End(); // Most everything else is a single token. // This is inefficient, but expandable buf.Begin(TRPGMAT_SHADE); buf.Add(shadeModel); buf.End(); buf.Begin(TRPGMAT_SIZES); buf.Add(pointSize); buf.Add(lineWidth); buf.End(); buf.Begin(TRPGMAT_CULL); buf.Add(cullMode); buf.End(); buf.Begin(TRPGMAT_ALPHA); buf.Add(alphaFunc); buf.Add(alphaRef); buf.Add(alpha); buf.End(); buf.Begin(TRPGMAT_NORMAL); buf.Add((int32)autoNormal); buf.End(); buf.Begin(TRPGMAT_TEXTURE); buf.Add(numTex); for (int i=0;i<numTex;i++) { buf.Add(texids[i]); texEnvs[i].Write(buf); } buf.End(); // Bump mapping properties buf.Begin(TRPGMAT_BUMP); buf.Add((int32)isBump); buf.End(); // Attributes (e.g. fid, smc) buf.Begin(TRPGMAT_ATTR); buf.Add(attrSet.fid); buf.Add(attrSet.smc); buf.Add(attrSet.stp); buf.Add(attrSet.swc); buf.End(); /** * If the terrapage version is >= 2.3, handle will be set to a unique identifier. **/ if(writeHandle) { buf.Begin(TRPGMAT_HANDLE); buf.Add((int)handle); buf.End(); } buf.End(); return true; }
// Writes this class to a write buffer bool trpgLightAttr::Write(trpgWriteBuffer &buf) { buf.Begin(TRPGLIGHTATTR); buf.Begin(TRPGLIGHTATTR_BASIC); buf.Add((int)data.type); buf.Add((int)data.directionality); buf.Add(data.frontColor); buf.Add(data.frontIntensity); buf.Add(data.backColor); buf.Add(data.backIntensity); buf.Add(data.normal); buf.Add(data.smc); buf.Add(data.fid); buf.Add(data.flags); buf.Add(data.horizontalLobeAngle); buf.Add(data.verticalLobeAngle); buf.Add(data.lobeRollAngle); buf.Add(data.lobeFalloff); buf.Add(data.ambientIntensity); buf.Add((int)data.quality); buf.Add((int)data.randomIntensity); buf.End(); buf.Begin(TRPGLIGHTATTR_RASCAL); buf.Add(data.rascalSignificance); buf.End(); buf.Begin(TRPGLIGHTATTR_CALLIGRAPHIC); buf.Add(data.calligraphicAttr.drawOrder); buf.Add(data.calligraphicAttr.minDefocus); buf.Add(data.calligraphicAttr.maxDefocus); buf.End(); buf.Begin(TRPGLIGHTATTR_PERFORMER); buf.Add(data.performerAttr.actualSize); buf.Add(data.performerAttr.fogScale); buf.Add(data.performerAttr.minPixelSize); buf.Add(data.performerAttr.maxPixelSize); buf.Add(data.performerAttr.transparentClamp); buf.Add(data.performerAttr.transparentFallofExp); buf.Add(data.performerAttr.transparentPixelSize); buf.Add(data.performerAttr.transparentScale); buf.End(); buf.Begin(TRPGLIGHTATTR_ANIMATION); buf.Add(data.animationAttr.period); buf.Add(data.animationAttr.phaseDelay); buf.Add(data.animationAttr.timeOn); buf.Add(data.animationAttr.vector); buf.End(); if (data.commentStr) { buf.Begin(TRPGLIGHTATTR_COMMENT); buf.Add(data.commentStr); buf.End(); } if(writeHandle) { buf.Begin(TRPGLIGHTATTR_HANDLE); buf.Add((int)handle); buf.End(); } buf.End(); return true; }
// Write a model reference out bool trpgModel::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; // We will use two different tokens to track the // format used in terrapage 2.2, and older versions int tok = TRPGMODELREF; if (writeHandle) tok = TRPGMODELREF2; // Nick messed up the model entries when checking into txv4; now we're // a bit stuck because U3 dbs don't have models in the U2 viewer. // This will force the old behavior. #ifdef OLDMODELSTYLE buf.Begin(tok); buf.Add(type); // writeHandle is only set for terrapage 2.2, and we use the different token. if (writeHandle) { buf.Add((int)handle); } if (name) buf.Add(name); else buf.Add(diskRef); buf.Add(useCount); #else buf.Begin(tok); if (writeHandle) { buf.Add((int)handle); } buf.Add(type); buf.Add(name); buf.Add(diskRef); buf.Add(useCount); #endif buf.End(); return true; }
// Write tile table bool trpgTileTable::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; buf.Begin(TRPGTILETABLE2); // Write the mode buf.Add(mode); // Depending on the mode we'll have a lot or a little data if (mode == Local || mode == ExternalSaved) { // The lod sizing is redundant, but it's convenient here int numLod = lodInfo.size(); buf.Add(numLod); // Write each terrain LOD set for (int i=0;i<numLod;i++) { LodInfo &li = lodInfo[i]; if(localBlock) { // only one x and one y in a local archive buf.Add(1); buf.Add(1); // local blocks always use index 0 trpgwAppAddress &ref = li.addr[0]; buf.Add((int32)ref.file); buf.Add((int32)ref.offset); buf.Add(li.elev_min[0]); buf.Add(li.elev_max[0]); } else { buf.Add(li.numX); buf.Add(li.numY); // Now for the interesting stuff unsigned int j; for (j=0;j<li.addr.size();j++) { trpgwAppAddress &ref = li.addr[j]; buf.Add((int32)ref.file); buf.Add((int32)ref.offset); } for (j=0;j<li.elev_min.size();j++) { buf.Add(li.elev_min[j]); buf.Add(li.elev_max[j]); } } } } buf.End(); return true; }
// Write geometry fields. // Order doesn't matter very much for this bool trpgGeometry::Write(trpgWriteBuffer &buf) { unsigned int i,j; if (!isValid()) return false; buf.Begin(TRPG_GEOMETRY); /* Primitive info Primitive Type Number of primitives Primitive array lengths */ buf.Begin(TRPG_GEOM_PRIM); buf.Add(primType); buf.Add(numPrim); if (primLength.size() != 0) { buf.Add((uint8)1); for (i=0;i<(unsigned int)numPrim;i++) buf.Add(primLength[i]); } else buf.Add((uint8)0); buf.End(); /* Material info Num materials Material indicies */ if (materials.size() > 0) { buf.Begin(TRPG_GEOM_MATERIAL); buf.Add((int32)materials.size()); for (i=0;i<materials.size();i++) buf.Add(materials[i]); buf.End(); } /* Vertices Float and Double should never both be here Num vertex Vertex data */ if (vertDataFloat.size() > 0) { buf.Begin(TRPG_GEOM_VERT32); int32 num = vertDataFloat.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(vertDataFloat[i]); buf.End(); } if (vertDataDouble.size() > 0) { buf.Begin(TRPG_GEOM_VERT64); int32 num = vertDataDouble.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(vertDataDouble[i]); buf.End(); } /* Normals Normal binding Num normals Normal data */ if (normDataFloat.size() > 0) { buf.Begin(TRPG_GEOM_NORM32); buf.Add((int32)normBind); int32 num = normDataFloat.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(normDataFloat[i]); buf.End(); } if (normDataDouble.size() > 0) { buf.Begin(TRPG_GEOM_NORM64); buf.Add((int32)normBind); int32 num = normDataDouble.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(normDataDouble[i]); buf.End(); } /* Colors Color binding Num colors Colors */ if (colors.size() > 0) { for (i=0;i<colors.size();i++) { trpgColorInfo &ci = colors[i]; if (ci.data.size()) { buf.Begin(TRPG_GEOM_COLOR); buf.Add((int32)ci.type); buf.Add((int32)ci.bind); buf.Add((int32)ci.data.size()); for (j=0;j<ci.data.size();j++) buf.Add(ci.data[j]); buf.End(); } } } /* Texture coordinates Binding Num coords Texture coords */ for (i=0;i<texData.size();i++) { trpgTexData &td = texData[i]; if (td.floatData.size()) { buf.Begin(TRPG_GEOM_TEX32); buf.Add((int32)td.bind); int32 num = td.floatData.size()/2; buf.Add(num); for (j=0;j<(unsigned int)num*2;j++) buf.Add(td.floatData[j]); buf.End(); } if (td.doubleData.size()) { buf.Begin(TRPG_GEOM_TEX64); buf.Add((int32)td.bind); int32 num = td.doubleData.size()/2; buf.Add(num); for (j=0;j<(unsigned int)num*2;j++) buf.Add(td.doubleData[j]); buf.End(); float u; for (j=0;j<(unsigned int)num*2;j++) u = (float)td.doubleData[j]; } } // Edge flags (for triangle strips, etc..) if (edgeFlags.size() > 0) { buf.Begin(TRPG_GEOM_EFLAG); buf.Add((int32)edgeFlags.size()); for (i=0;i<edgeFlags.size();i++) buf.Add(edgeFlags[i]); buf.End(); } buf.End(); return true; }
bool trpgMatTable1_0::Write(trpgWriteBuffer &buf) { if (!isValid()) return false; // Create one short material for every material std::vector<trpgShortMaterial> shortMats; shortMats.resize(numTable*numMat); // Iterate over the existing materials int i=0; MaterialMapType::iterator itr = materialMap.begin(); for ( ; itr != materialMap.end( ); itr++) { //for (i=0;i<numTable*numMat;i++) { trpgMaterial &mat = itr->second; //matTables[i]; // Fill in the short material trpgShortMaterial &sMat = shortMats[i]; sMat.baseMat = 0; int numTex; mat.GetNumTexture(numTex); for (int j=0;j<numTex;j++) { int texId; trpgTextureEnv texEnv; mat.GetTexture(j,texId,texEnv); sMat.texids.push_back(texId); sMat.baseMat = i; } i++; } // Write the 1.0 material table buf.Begin(TRPGMATTABLE2); buf.Add(numTable); buf.Add(numMat); // Write the short materials buf.Begin(TRPGSHORTMATTABLE); for (i=0;i<static_cast<int>(shortMats.size());i++) { trpgShortMaterial &sMat = shortMats[i]; buf.Add(sMat.baseMat); buf.Add((int)(sMat.texids.size())); unsigned int j; for (j=0;j<sMat.texids.size();j++) buf.Add(sMat.texids[j]); } buf.End(); // Write the regular materials buf.Add((int)materialMap.size());//numTable*numMat); //for (i=0;i<numTable*numMat;i++) { itr = materialMap.begin(); for ( ; itr != materialMap.end( ); itr++) { trpgMaterial &mat = itr->second; //matTables[i]; // This will be bigger than the old 1.0 material, but it doesn't matter since // the new stuff is on the end. mat.Write(buf); } // Close Mat Table buf.End(); return true; }