void BinaryWriterVisitor::visit(const MaterialMap& map, u32 version) {
(void)version;
writer.write(map.materialType);
writer.write(map.materialIndex);
}
void BinaryWriterVisitor::visit(const TextureLayer& layer, u32 version) {
writer.write(layer.id);
visit(layer.texturePath);
writer.write(layer.color);
writer.write(layer.flags);
writer.write(layer.uvMapping);
writer.write(layer.colorType);
writer.write(layer.rgbMultiply);
writer.write(layer.rgbAdd);
writer.write(layer.pocTexture);
if (version >= 24) {
writer.write(layer.noiseAmplitude);
writer.write(layer.noiseFrequency);
}
writer.write(layer.textureSource);
writer.write(layer.aviFrameRate);
writer.write(layer.aviStart);
writer.write(layer.aviStop);
writer.write(layer.aviLoop);
writer.write(layer.aviSync);
writer.write(layer.aviPlay);
writer.write(layer.aviRestart);
writer.write(layer.flipbookRows);
writer.write(layer.flipbookColumns);
writer.write(layer.currentFrame);
writer.write(layer.uvOffset);
writer.write(layer.uvAngle);
writer.write(layer.uvTiling);
writer.write(layer.wOffset);
writer.write(layer.wTiling);
writer.write(layer.mapAlpha);
if (version >= 23) {
writer.write(layer.triplanarOffset);
writer.write(layer.triplanarScale);
}
writer.write(layer.uvSourceRelated);
writer.write(layer.fresnelMode);
writer.write(layer.fresnelExponent);
writer.write(layer.fresnelMin);
writer.write(layer.fresnelMax);
if (version >= 25) {
writer.write(layer.fresnelTranslation);
writer.write(layer.fresnelMask);
writer.write(layer.fresnelRotation);
}
if (version < 26) {
writer.write(layer.uvDensity);
}
}
void BinaryWriterVisitor::visitLayerSlot(const std::optional<TextureLayer>& layer) {
visit(layer.has_value() ? layer : emptyLayer);
}
void BinaryWriterVisitor::visit(const StandardMaterial& material, u32 version) {
visit(material.name);
writer.write(material.additionalFlags);
writer.write(material.flags);
writer.write(material.blendMode);
writer.write(material.priority);
writer.write(material.rttChannels);
writer.write(material.specularExponent);
writer.write(material.depthBlendFalloff);
writer.write(material.alphaTestThreshold);
writer.write(material.hdrSpecularMultiplier);
writer.write(material.hdrEmissiveMultiplier);
if (version >= 20) {
writer.write(material.hdrEnvironmentConstant);
writer.write(material.hdrEnvironmentDiffuse);
writer.write(material.hdrEnvironmentSpecular);
}
visitLayerSlot(material.diffuseLayer);
visitLayerSlot(material.decalLayer);
visitLayerSlot(material.specularLayer);
if (version >= 16) {
visitLayerSlot(material.glossLayer);
}
visitLayerSlot(material.emissiveLayer1);
visitLayerSlot(material.emissiveLayer2);
visitLayerSlot(material.environmentLayer);
visitLayerSlot(material.environmentMaskLayer);
visitLayerSlot(material.alphaLayer1);
visitLayerSlot(material.alphaLayer2);
visitLayerSlot(material.normalLayer);
visitLayerSlot(material.heightLayer);
visitLayerSlot(material.lightMapLayer);
visitLayerSlot(material.ambientOcclusionLayer);
if (version >= 19) {
visitLayerSlot(material.normalBlend1MaskLayer);
visitLayerSlot(material.normalBlend2MaskLayer);
visitLayerSlot(material.normalBlend1Layer);
visitLayerSlot(material.normalBlend2Layer);
}
writer.write(material.materialClass);
writer.write(material.layerBlendMode);
writer.write(material.emissiveBlendMode1);
writer.write(material.emissiveBlendMode2);
writer.write(material.specularMode);
writer.write(material.parallaxHeight);
writer.write(material.motionBlurAmount);
if (version >= 19) {
visit(material.normalBlendFactors);
}
}
void BinaryWriterVisitor::visit(const DisplacementMaterial& material, u32 version) {
(void)version;
visit(material.name);
writer.write(material.unknown);
writer.write(material.strength);
visit(material.normalMap);
visit(material.strengthMap);
writer.write(material.flags);
writer.write(material.priority);
}
void BinaryWriterVisitor::visit(const CompositeSection& section, u32 version) {
(void)version;
writer.write(section.materialIndex);
writer.write(section.mapMultiplier);
}
void BinaryWriterVisitor::visit(const CompositeMaterial& material, u32 version) {
(void)version;
visit(material.name);
writer.write(material.priority);
visit(material.sections);
}
void BinaryWriterVisitor::visit(const TerrainMaterial& material, u32 version) {
visit(material.name);
visit(material.terrainMap);
if (version >= 1) {
writer.write(material.unknown);
}
}
void BinaryWriterVisitor::visit(const VolumeMaterial& material, u32 version) {
(void)version;
visit(material.name);
writer.write(material.blendMode);
writer.write(material.falloffType);
writer.write(material.density);
visit(material.colorMap);
visit(material.noiseMap1);
visit(material.noiseMap2);
writer.write(material.alphaThreshold);
writer.write(material.flags);
}
void BinaryWriterVisitor::visit(const HairMaterial& material, u32 version) {
(void)version;
visit(material.name);
visit(material.layerBase);
visit(material.layerSpecShift);
visit(material.layerSpecNoise);
visit(material.layerAO);
writer.write(material.shiftPrimary);
writer.write(material.shiftSecondary);
writer.write(material.colorDiffuse);
writer.write(material.colorSpec);
writer.write(material.specExponent0);
writer.write(material.specExponent1);
}
void BinaryWriterVisitor::visit(const VolumeNoiseMaterial& material, u32 version) {
(void)version;
visit(material.name);
writer.write(material.falloffType);
writer.write(material.drawTransparency);
writer.write(material.density);
writer.write(material.nearPlane);
writer.write(material.falloff);
visit(material.colorMap);
visit(material.noiseMap1);
visit(material.noiseMap2);
writer.write(material.scrollRate);
writer.write(material.position);
writer.write(material.scale);
writer.write(material.rotation);
writer.write(material.alphaThreshold);
writer.write(material.flags);
}
void BinaryWriterVisitor::visit(const CreepMaterial& material, u32 version) {
visit(material.name);
visit(material.maskMap);
if (version >= 1) {
writer.write(material.creepLow);
}
}
void BinaryWriterVisitor::visit(const STBMaterial& material, u32 version) {
(void)version;
visit(material.name);
visit(material.diffuseMap);
visit(material.normalMap);
visit(material.specularMap);
}
void BinaryWriterVisitor::visit(const ReflectionMaterial& material, u32 version) {
visit(material.name);
writer.write(material.unknown);
writer.write(material.reflectionStrength);
writer.write(material.displacementStrength);
if (version >= 2) {
writer.write(material.reflectionOffset);
writer.write(material.blurAngle);
writer.write(material.blurDistanceMax);
}
visit(material.reflectionMap);
visit(material.displacementMap);
if (version >= 2) {
visit(material.blurMap);
}
writer.write(material.flags);
if (version >= 3) {
writer.write(material.unknown2);
}
}
void BinaryWriterVisitor::visit(const SubFlare& flare, u32 version) {
(void)version;
writer.write(flare.index);
writer.write(flare.position);
writer.write(flare.sizeXY);
writer.write(flare.scaleXY);
writer.write(flare.fadeIn);
writer.write(flare.fadeOut);
writer.write(flare.colorAlpha);
writer.write(flare.faceCenter);
writer.write(flare.offset);
}
void BinaryWriterVisitor::visit(const LensFlare& flare, u32 version) {
visit(flare.name);
visit(flare.flareMap);
visit(flare.maskMap);
visit(flare.subFlares);
writer.write(flare.columns);
writer.write(flare.rows);
writer.write(flare.distanceFade);
if (version >= 3) {
visit(flare.libName);
}
writer.write(flare.intensity);
if (version >= 3) {
writer.write(flare.color);
writer.write(flare.hdr);
writer.write(flare.size);
}
}
void BinaryWriterVisitor::visit(const DataDrivenMaterial& data, u32 version) {
visit(data.materialName);
visit(data.fragmentHashes);
if (version >= 2) {
visit(data.extraHashes);
}
visitCharBlob(data.propertyBlob);
visit(data.texturePaths);
for (int i = 0; i < 4; ++i) {
Reference reserved = {};
writeReferenceFunc(reserved);
}
writer.write(data.unknown108);
writer.write(data.unknown112);
writer.write(data.unknown116);
writer.write(data.effectNameHash);
writer.write(data.unknown124);
writer.write(data.padding128);
writer.write(data.unknown132);
writer.write(data.unknown136);
writer.write(data.unknown140);
writer.write(data.unknown144);
writer.write(data.unknown148);
writer.write(data.alphaFresnelFlags);
writer.write(static_cast<u8>(data.shaderType));
writer.write(data.unknown151);
if (version >= 3) {
writer.write(data.effectNameHash2);
writer.write(data.effectNameHash3);
}
}