// 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;
}
Example #2
0
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;

}
Example #3
0
// 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;
}
Example #4
0
// 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;
}
Example #5
0
// 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;
}
Example #6
0
// 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;
}
Example #7
0
// 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;
}
Example #8
0
// 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;
}
Example #10
0
// 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;
}
Example #11
0
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;
}
Example #15
0
// 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;
}
Example #16
0
// 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;
}
Example #17
0
// 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;
}
Example #18
0
// 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;
}
Example #19
0
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;
}