/*
===========================================================================
Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
Doom 3 Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 Source Code. If not, see .
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#pragma once
#include "MaterialEditor.h"
#include "MaterialModifier.h"
#include "MaterialDef.h"
/**
* Dictionary representation of a Material Stage.
*/
typedef struct {
idDict stageData;
bool enabled;
} MEStage_t;
/**
* Dictionary representation of a material.
*/
typedef struct {
idDict materialData;
idList stages;
} MEMaterial_t;
/**
* Implemented by the edit window that is responsible for modifying the material source text.
*/
class SourceModifyOwner {
public:
SourceModifyOwner() {};
virtual ~SourceModifyOwner() {};
virtual idStr GetSourceText() { return ""; };
};
class MaterialDocManager;
/**
* Responsible for managing a single material that is being viewed and/or edited.
*/
class MaterialDoc {
public:
MaterialDocManager* manager;
idStr name;
idMaterial* renderMaterial;
MEMaterial_t editMaterial;
bool modified;
bool applyWaiting;
bool deleted;
bool sourceModify;
SourceModifyOwner* sourceModifyOwner;
public:
MaterialDoc(void);
~MaterialDoc(void);
/**
* Define the types of stages in a material.
*/
enum {
STAGE_TYPE_NORMAL,
STAGE_TYPE_SPECIALMAP
};
//Initialization Methods
void SetRenderMaterial(idMaterial* material, bool parseMaterial = true, bool parseRenderMatierial = false);
//Stage Info Methods
int GetStageCount();
int FindStage(int stageType, const char* name);
MEStage_t GetStage(int stage);
void EnableStage(int stage, bool enabled);
void EnableAllStages(bool enabled);
bool IsStageEnabled(int stage);
//Get Attributes
const char* GetAttribute(int stage, const char* attribName, const char* defaultString = "");
int GetAttributeInt(int stage, const char* attribName, const char* defaultString = "0");
float GetAttributeFloat(int stage, const char* attribName, const char* defaultString = "0");
bool GetAttributeBool(int stage, const char* attribName, const char* defaultString = "0");
//Set Attribute Methods
void SetAttribute(int stage, const char* attribName, const char* value, bool addUndo = true);
void SetAttributeInt(int stage, const char* attribName, int value, bool addUndo = true);
void SetAttributeFloat(int stage, const char* attribName, float value, bool addUndo = true);
void SetAttributeBool(int stage, const char* attribName, bool value, bool addUndo = true);
void SetMaterialName(const char* materialName, bool addUndo = true);
void SetData(int stage, idDict* data);
//Source Editing Methods
void SourceModify(SourceModifyOwner* owner);
bool IsSourceModified();
void ApplySourceModify(idStr& text);
const char* GetEditSourceText();
//Stage Modification Methods
void AddStage(int stageType, const char* stageName, bool addUndo = true);
void InsertStage(int stage, int stageType, const char* stageName, bool addUndo = true);
void RemoveStage(int stage, bool addUndo = true);
void ClearStages();
void MoveStage(int from, int to, bool addUndo = true);
void ApplyMaterialChanges(bool force = false);
void Save();
void Delete();
protected:
//Internal Notifications
void OnMaterialChanged();
//Load Material Methods
void ParseMaterialText(const char* source);
void ParseMaterial(idLexer* src);
void ParseStage(idLexer* src);
void AddSpecialMapStage(const char* stageName, const char* map);
bool ParseMaterialDef(idToken* token, idLexer* src, int type, idDict* dict);
void ClearEditMaterial();
//Save/Apply Material Methods
const char* GenerateSourceText();
void ReplaceSourceText();
void WriteStage(int stage, idFile_Memory* file);
void WriteSpecialMapStage(int stage, idFile_Memory* file);
void WriteMaterialDef(int stage, idFile_Memory* file, int type, int indent);
};