dhewm3/neo/tools/materialeditor/MaterialModifier.cpp

429 lines
13 KiB
C++
Raw Normal View History

2011-11-22 21:28:15 +00:00
/*
===========================================================================
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 <http://www.gnu.org/licenses/>.
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.
===========================================================================
*/
#include "../../idlib/precompiled.h"
#pragma hdrstop
#include "MaterialModifier.h"
#include "MaterialDocManager.h"
#include "MaterialTreeView.h"
//////////////////////////////////////////////////////////////////////////////
//MaterialModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for MaterialModifier
*/
MaterialModifier::MaterialModifier(MaterialDocManager* manager, const char* materialName) {
this->manager = manager;
this->materialName = materialName;
}
//////////////////////////////////////////////////////////////////////////////
//AttributeMaterialModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for AttributeMaterialModifier
*/
AttributeMaterialModifier::AttributeMaterialModifier(MaterialDocManager* manager, const char* materialName, int stage, const char* key)
: MaterialModifier(manager, materialName) {
this->stage = stage;
this->key = key;
}
//////////////////////////////////////////////////////////////////////////////
//AttributeMaterialModifierString
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for AttributeMaterialModifierString
*/
AttributeMaterialModifierString::AttributeMaterialModifierString(MaterialDocManager* manager, const char* materialName, int stage, const char* key, const char* value, const char* oldValue)
: AttributeMaterialModifier(manager, materialName, stage, key) {
this->value = value;
this->oldValue = oldValue;
}
/**
* Performs an undo operation of a string attribute change.
*/
void AttributeMaterialModifierString::Undo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->SetAttribute(stage, key, oldValue, false);
}
/**
* Performs a redo operation of a string attribute change.
*/
void AttributeMaterialModifierString::Redo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->SetAttribute(stage, key, value, false);
}
//////////////////////////////////////////////////////////////////////////////
//AttributeMaterialModifierBool
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for AttributeMaterialModifierBool
*/
AttributeMaterialModifierBool::AttributeMaterialModifierBool(MaterialDocManager* manager, const char* materialName, int stage, const char* key, bool value, bool oldValue)
: AttributeMaterialModifier(manager, materialName, stage, key) {
this->value = value;
this->oldValue = oldValue;
}
/**
* Performs an undo operation of a boolean attribute change.
*/
void AttributeMaterialModifierBool::Undo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->SetAttributeBool(stage, key, oldValue, false);
}
/**
* Performs a redo operation of a boolean attribute change.
*/
void AttributeMaterialModifierBool::Redo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->SetAttributeBool(stage, key, value, false);
}
//////////////////////////////////////////////////////////////////////////////
//StageMoveModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for StageMoveModifier
*/
StageMoveModifier::StageMoveModifier(MaterialDocManager* manager, const char* materialName, int from, int to)
: MaterialModifier(manager, materialName) {
this->from = from;
this->to = to;
}
/**
* Performs an undo operation of a stage move.
*/
void StageMoveModifier::Undo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->MoveStage(to, from, false);
}
/**
* Performs a redo operation of a moved stage.
*/
void StageMoveModifier::Redo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->MoveStage(from, to, false);
}
//////////////////////////////////////////////////////////////////////////////
//StageDeleteModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for StageDeleteModifier
*/
StageDeleteModifier::StageDeleteModifier(MaterialDocManager* manager, const char* materialName, int stageNum, idDict stageData)
: MaterialModifier(manager, materialName) {
this->stageNum = stageNum;
this->stageData = stageData;
}
/**
* Performs an undo operation of a deleted stage.
*/
void StageDeleteModifier::Undo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->InsertStage(stageNum, stageData.GetInt("stagetype"), stageData.GetString("name"), false);
material->SetData(stageNum, &stageData);
}
/**
* Performs a redo operation of a deleted stage.
*/
void StageDeleteModifier::Redo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->RemoveStage(stageNum, false);
}
//////////////////////////////////////////////////////////////////////////////
//StageInsertModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for StageInsertModifier
*/
StageInsertModifier::StageInsertModifier(MaterialDocManager* manager, const char* materialName, int stageNum, int stageType, const char* stageName)
: MaterialModifier(manager, materialName) {
this->stageNum = stageNum;
this->stageType = stageType;
this->stageName = stageName;
}
/**
* Performs an undo operation of an inserted stage.
*/
void StageInsertModifier::Undo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->RemoveStage(stageNum, false);
}
/**
* Performs a redo operation of an inserted stage.
*/
void StageInsertModifier::Redo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->InsertStage(stageNum, stageType, stageName, false);
}
//////////////////////////////////////////////////////////////////////////////
//AddMaterialModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for AddMaterialModifier
*/
AddMaterialModifier::AddMaterialModifier(MaterialDocManager* manager, const char* materialName, const char* materialFile)
: MaterialModifier(manager, materialName) {
this->materialFile = materialFile;
}
/**
* Performs an undo operation of an added material.
*/
void AddMaterialModifier::Undo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
manager->DeleteMaterial(material, false);
}
/**
* Performs a redo operation of an added material.
*/
void AddMaterialModifier::Redo() {
manager->RedoAddMaterial(materialName);
}
//////////////////////////////////////////////////////////////////////////////
//DeleteMaterialModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for DeleteMaterialModifier
*/
DeleteMaterialModifier::DeleteMaterialModifier(MaterialDocManager* manager, const char* materialName)
: MaterialModifier(manager, materialName) {
}
/**
* Performs an undo operation of a deleted material.
*/
void DeleteMaterialModifier::Undo() {
manager->RedoAddMaterial(materialName, false);
}
/**
* Performs a redo operation of a deleted material.
*/
void DeleteMaterialModifier::Redo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
manager->DeleteMaterial(material, false);
}
//////////////////////////////////////////////////////////////////////////////
//MoveMaterialModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for MoveMaterialModifier
*/
MoveMaterialModifier::MoveMaterialModifier(MaterialDocManager* manager, const char* materialName, const char* materialFile, const char* copyMaterial)
: MaterialModifier(manager, materialName) {
this->materialFile = materialFile;
this->copyMaterial = copyMaterial;
}
/**
* Performs an undo operation of a moved material
*/
void MoveMaterialModifier::Undo() {
//Delete New Material
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
manager->DeleteMaterial(material, false);
//RedoAdd Old Material
manager->RedoAddMaterial(copyMaterial, false);
}
/**
* Performs a redo operation of a moved material.
*/
void MoveMaterialModifier::Redo() {
//Delete Old Material
MaterialDoc* material = manager->CreateMaterialDoc(copyMaterial);
manager->DeleteMaterial(material, false);
//Redo Add New Material
manager->RedoAddMaterial(materialName, false);
}
//////////////////////////////////////////////////////////////////////////////
//RenameMaterialModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for RenameMaterialModifier
*/
RenameMaterialModifier::RenameMaterialModifier(MaterialDocManager* manager, const char* materialName, const char* oldName)
: MaterialModifier(manager, materialName) {
this->oldName = oldName;
}
/**
* Performs an undo operation of a renamed material
*/
void RenameMaterialModifier::Undo() {
MaterialDoc* material = manager->CreateMaterialDoc(materialName);
material->SetMaterialName(oldName, false);
}
/**
* Performs a redo operation of a renamed material.
*/
void RenameMaterialModifier::Redo() {
MaterialDoc* material = manager->CreateMaterialDoc(oldName);
material->SetMaterialName(materialName, false);
}
//////////////////////////////////////////////////////////////////////////////
//AddMaterialFolderModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for AddMaterialFolderModifier
*/
AddMaterialFolderModifier::AddMaterialFolderModifier(MaterialDocManager* manager, const char* materialName, MaterialTreeView* view, HTREEITEM item, HTREEITEM parent)
: MaterialModifier(manager, materialName) {
this->view = view;
this->item = item;
this->parent = parent;
}
/**
* Performs an undo operation of an added material folder.
*/
void AddMaterialFolderModifier::Undo() {
view->DeleteFolder(item, false);
}
/**
* Performs a redo operation of an added material folder.
*/
void AddMaterialFolderModifier::Redo() {
view->AddFolder(materialName, parent);
}
//////////////////////////////////////////////////////////////////////////////
//RenameMaterialFolderModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for RenameMaterialFolderModifier
*/
RenameMaterialFolderModifier::RenameMaterialFolderModifier(MaterialDocManager* manager, const char* materialName, MaterialTreeView* view, HTREEITEM item, const char* oldName)
: MaterialModifier(manager, materialName) {
this->view = view;
this->item = item;
this->oldName = oldName;
}
/**
* Performs an undo operation of a renamed material folder.
*/
void RenameMaterialFolderModifier::Undo() {
view->RenameFolder(item, oldName);
}
/**
* Performs a redo operation of a renamed material folder.
*/
void RenameMaterialFolderModifier::Redo() {
view->RenameFolder(item, materialName);
}
//////////////////////////////////////////////////////////////////////////////
//DeleteMaterialFolderModifier
//////////////////////////////////////////////////////////////////////////////
/**
* Constructor for DeleteMaterialFolderModifier
*/
DeleteMaterialFolderModifier::DeleteMaterialFolderModifier(MaterialDocManager* manager, const char* materialName, MaterialTreeView* view, HTREEITEM parent, idStrList* affectedMaterials)
: MaterialModifier(manager, materialName) {
this->view = view;
this->parent = parent;
this->affectedMaterials = *affectedMaterials;
}
/**
* Performs an undo operation of a deleted material folder.
*/
void DeleteMaterialFolderModifier::Undo() {
//Add the folder back and save the folder position for the redo
item = view->AddFolder(materialName, parent);
//Add each of the children back
for(int i = 0; i < affectedMaterials.Num(); i++) {
manager->RedoAddMaterial(affectedMaterials[i], false);
}
}
/**
* Performs a redo operation of a deleted material folder.
*/
void DeleteMaterialFolderModifier::Redo() {
view->DeleteFolder(item, false);
}