metaforce/DataSpec/DNAMP3/CMDLMaterials.hpp

207 lines
8.0 KiB
C++
Raw Normal View History

2018-10-07 03:42:33 +00:00
#pragma once
2018-06-29 20:21:36 +00:00
#include "DataSpec/DNACommon/DNACommon.hpp"
#include "DataSpec/DNACommon/GX.hpp"
#include "../DNAMP1/CMDLMaterials.hpp"
#include "DNAMP3.hpp"
2017-12-29 08:08:12 +00:00
namespace DataSpec::DNAMP3
{
struct MaterialSet : BigDNA
{
2015-09-19 01:38:40 +00:00
static constexpr bool OneSection() {return true;}
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
Value<atUint32> materialCount;
2015-10-19 03:28:47 +00:00
/* Dummy methods from MP1/2 */
void addTexture(const UniqueID32&) {}
void addMaterialEndOff(atUint32) {++materialCount;}
struct Material : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_EXPLICIT_DNA
using VAFlags = DNAMP1::MaterialSet::Material::VAFlags;
struct Header : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
Value<atUint32> size;
struct Flags : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
Value<atUint32> flags;
2015-09-07 04:05:44 +00:00
bool alphaBlending() const {return (flags & 0x8) != 0;}
void setAlphaBlending(bool enabled) {flags &= ~0x8; flags |= atUint32(enabled) << 3;}
2018-11-08 00:53:38 +00:00
bool alphaTest() const {return (flags & 0x10) != 0;}
2015-09-07 04:05:44 +00:00
void setPunchthroughAlpha(bool enabled) {flags &= ~0x10; flags |= atUint32(enabled) << 4;}
bool additiveBlending() const {return (flags & 0x20) != 0;}
void setAdditiveBlending(bool enabled) {flags &= ~0x20; flags |= atUint32(enabled) << 5;}
bool shadowOccluderMesh() const {return (flags & 0x100) != 0;}
void setShadowOccluderMesh(bool enabled) {flags &= ~0x100; flags |= atUint32(enabled) << 8;}
bool lightmapUVArray() const {return false;} /* For polymorphic compatibility with MP1/2 */
} flags;
2018-04-02 04:27:24 +00:00
Value<atUint32> uniqueIdx;
Value<atUint32> unk1;
2015-08-15 22:56:55 +00:00
VAFlags vaFlags;
Value<atUint32> unk2;
Value<atUint32> unk3;
Value<atUint32> unk4;
} header;
2015-09-07 04:05:44 +00:00
const Header::Flags& getFlags() const {return header.flags;}
const VAFlags& getVAFlags() const {return header.vaFlags;}
2018-02-22 07:24:51 +00:00
struct ISection : BigDNAV
{
Delete expl;
2015-11-21 01:16:07 +00:00
enum class Type : atUint32
{
PASS = SBIG('PASS'),
CLR = SBIG('CLR '),
INT = SBIG('INT ')
} m_type;
ISection(Type type) : m_type(type) {}
2017-12-29 08:08:12 +00:00
virtual void constructNode(hecl::blender::PyOutStream& out,
2015-09-19 01:38:40 +00:00
const PAKRouter<PAKBridge>& pakRouter,
const PAK::Entry& entry,
const Material::ISection* prevSection,
unsigned idx,
unsigned& texMapIdx,
unsigned& texMtxIdx,
unsigned& kColorIdx) const=0;
};
struct SectionPASS : ISection
{
2015-11-21 01:16:07 +00:00
SectionPASS() : ISection(ISection::Type::PASS) {}
2018-10-07 02:59:17 +00:00
static SectionPASS* castTo(ISection* sec)
{ return sec->m_type == Type::PASS ? static_cast<SectionPASS*>(sec) : nullptr; }
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
AT_DECL_DNAV
Value<atUint32> size;
2015-11-21 01:16:07 +00:00
enum class Subtype : atUint32
{
DIFF = SBIG('DIFF'),
RIML = SBIG('RIML'),
BLOL = SBIG('BLOL'),
BLOD = SBIG('BLOD'),
CLR = SBIG('CLR '),
TRAN = SBIG('TRAN'),
INCA = SBIG('INCA'),
RFLV = SBIG('RFLV'),
RFLD = SBIG('RFLD'),
LRLD = SBIG('LRLD'),
LURD = SBIG('LURD'),
BLOI = SBIG('BLOI'),
XRAY = SBIG('XRAY'),
TOON = SBIG('TOON')
};
2015-08-23 06:42:29 +00:00
DNAFourCC subtype;
struct Flags : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
Value<atUint32> flags;
2015-09-19 01:38:40 +00:00
bool TRANInvert() const {return (flags & 0x10) != 0;}
void setTRANInvert(bool enabled) {flags &= ~0x10; flags |= atUint32(enabled) << 4;}
} flags;
UniqueID64 txtrId;
Value<atUint32> uvSrc;
Value<atUint32> uvAnimSize;
struct UVAnimation : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
Value<atUint16> unk1;
Value<atUint16> unk2;
DNAMP1::MaterialSet::Material::UVAnimation anim;
};
2018-02-25 08:23:27 +00:00
Vector<UVAnimation, AT_DNA_COUNT(uvAnimSize != 0)> uvAnim;
2015-09-19 01:38:40 +00:00
2017-12-29 08:08:12 +00:00
void constructNode(hecl::blender::PyOutStream& out,
2015-09-19 01:38:40 +00:00
const PAKRouter<PAKBridge>& pakRouter,
const PAK::Entry& entry,
const Material::ISection* prevSection,
unsigned idx,
unsigned& texMapIdx,
unsigned& texMtxIdx,
unsigned& kColorIdx) const;
};
struct SectionCLR : ISection
{
2015-11-21 01:16:07 +00:00
SectionCLR() : ISection(ISection::Type::CLR) {}
2018-10-07 02:59:17 +00:00
static SectionCLR* castTo(ISection* sec)
{ return sec->m_type == Type::CLR ? static_cast<SectionCLR*>(sec) : nullptr; }
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
AT_DECL_DNAV
2015-11-21 01:16:07 +00:00
enum class Subtype : atUint32
{
CLR = SBIG('CLR '),
DIFB = SBIG('DIFB')
};
2015-08-23 06:42:29 +00:00
DNAFourCC subtype;
GX::Color color;
2015-09-19 01:38:40 +00:00
2017-12-29 08:08:12 +00:00
void constructNode(hecl::blender::PyOutStream& out,
2015-09-19 01:38:40 +00:00
const PAKRouter<PAKBridge>& pakRouter,
const PAK::Entry& entry,
const Material::ISection* prevSection,
unsigned idx,
unsigned& texMapIdx,
unsigned& texMtxIdx,
unsigned& kColorIdx) const;
};
struct SectionINT : ISection
{
2015-11-21 01:16:07 +00:00
SectionINT() : ISection(ISection::Type::INT) {}
2018-10-07 02:59:17 +00:00
static SectionINT* castTo(ISection* sec)
{ return sec->m_type == Type::INT ? static_cast<SectionINT*>(sec) : nullptr; }
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
AT_DECL_DNAV
2015-11-21 01:16:07 +00:00
enum class Subtype : atUint32
{
OPAC = SBIG('OPAC'),
BLOD = SBIG('BLOD'),
BLOI = SBIG('BLOI'),
BNIF = SBIG('BNIF'),
XRBR = SBIG('XRBR')
};
2015-08-23 06:42:29 +00:00
DNAFourCC subtype;
Value<atUint32> value;
2015-09-19 01:38:40 +00:00
2017-12-29 08:08:12 +00:00
void constructNode(hecl::blender::PyOutStream& out,
2015-09-19 01:38:40 +00:00
const PAKRouter<PAKBridge>& pakRouter,
const PAK::Entry& entry,
const Material::ISection* prevSection,
unsigned idx,
unsigned& texMapIdx,
unsigned& texMtxIdx,
unsigned& kColorIdx) const;
};
struct SectionFactory : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_EXPLICIT_DNA
std::unique_ptr<ISection> section;
};
std::vector<SectionFactory> sections;
};
2018-02-25 08:23:27 +00:00
Vector<Material, AT_DNA_COUNT(materialCount)> materials;
2017-12-29 08:08:12 +00:00
static void RegisterMaterialProps(hecl::blender::PyOutStream& out);
static void ConstructMaterial(hecl::blender::PyOutStream& out,
2015-09-19 01:38:40 +00:00
const PAKRouter<PAKBridge>& pakRouter,
const PAK::Entry& entry,
const MaterialSet::Material& material,
unsigned groupIdx, unsigned matIdx);
2017-12-29 08:08:12 +00:00
void readToBlender(hecl::blender::PyOutStream& os,
2015-09-07 04:05:44 +00:00
const PAKRouter<PAKBridge>& pakRouter,
const PAKRouter<PAKBridge>::EntryType& entry,
2015-09-19 01:38:40 +00:00
unsigned setIdx)
{
2015-09-19 01:38:40 +00:00
DNACMDL::ReadMaterialSetToBlender_3(os, *this, pakRouter, entry, setIdx);
}
2018-11-02 08:16:16 +00:00
void ensureTexturesExtracted(PAKRouter<PAKBridge>& pakRouter) const {}
};
}