Files
FC1/Editor/ShaderTemplateTool.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

379 lines
8.7 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2001.
// -------------------------------------------------------------------------
// File name: ShaderTemplateTool.h
// Version: v0.01
// Created: 13/2/2002 by Martin Mittring
// Compilers: Visual C++ 6.0
// Description: Shader template parameter tweaker
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "ShaderTemplateTool.h" // CShaderTemplateTool
#include "Viewport.h"
#include "ShaderTemplatePanel.h" // CShaderTemplatePanel
#include "PropertiesPanel.h" // CPropertiesPanel
#include "Heightmap.h"
#include "Objects\DisplayContext.h"
#include "ShaderEnum.h" // CShaderEnum
//#define EFQ_RegisteredTemplates 14
#include <vector> // STL vector<>
//using namespace std; // STL
struct IStatObj;
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CShaderTemplateTool,CEditTool)
//////////////////////////////////////////////////////////////////////////
CShaderTemplateTool::CShaderTemplateTool()
{
m_panelId = 0;
m_panel = 0;
// m_pointerPos.Set(0,0,0);
// m_bMakeHole = true;
// m_brushRadius = 1;
GetIEditor()->ClearSelection();
}
//////////////////////////////////////////////////////////////////////////
CShaderTemplateTool::~CShaderTemplateTool()
{
// m_pointerPos.Set(0,0,0);
if (GetIEditor()->IsUndoRecording())
GetIEditor()->CancelUndo();
}
//////////////////////////////////////////////////////////////////////////
void CShaderTemplateTool::BeginEditParams( IEditor *ie,int flags )
{
m_ie = ie;
if (!m_panelId)
{
XmlParser xml;
// XmlNodeRef root = xml.parse( "shadertemplates.xml" );
/*
CString str="\
<Root>\
<First type=\"INT\" value=\"12\"/>\
<FlattenArea type=\"Float\" value=\"12\"/>\
<Third type=\"INT\" value=\"12\"/>\
<Proximity type=\"Float\" value = \"10\"/>\
\
<SoundList type=\"List\">\
<Sound1 type=\"String\" value=\"First\"/>\
<Sound2 type=\"String\" value=\"Second\"/>\
<Sound3 type=\"String\" value=\"Third\"/>\
</SoundList>\
\
<FirstName type=\"String\" value=\"BlahBlah\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<Diameter type=\"INT\" value=\"12\"/>\
<OmniLight type=\"BOOL\" value=\"true\"/>\
<Radius type=\"Float\" value=\"12\"/>\
<Color type=\"Color\" value=\"254,122,48\"/>\
<Texture type=\"File\" value=\"test_texture.jpg\" FileFilters=\"Bitmaps (*.bmp)|*.bmp|PGM Files (*.pgm)|*.pgm|All files (*.*)|*.*\"/>\
<Blah type=\"File\" value=\"test_texture.jpg\" FileFilters=\"Bitmaps (*.bmp)|*.bmp|PGM Files (*.pgm)|*.pgm|All files (*.*)|*.*\"/>\
</Root>";
*/
//std::vector<char> xmlBuffer;
CString str="<Root></Root>";
// xmlBuffer.resize( str.GetLength() );
// memcpy( &xmlBuffer[0],str.GetBuffer(0),str.GetLength() );
XmlNodeRef xmlnode = xml.parseBuffer(str);
m_panel = new CShaderTemplatePanel(this,xmlnode,AfxGetMainWnd());
m_panelId = m_ie->AddRollUpPage( ROLLUP_TERRAIN,"Shader Template Properties",m_panel ); // fuck ROLLUP_TERRAIN has to be changed
AfxGetMainWnd()->SetFocus();
}
CShaderEnum *shaderenum=GetIEditor()->GetShaderEnum();
int nCount=shaderenum->EnumShaders();
// add shadername to combobox
for(int i=0;i<nCount;i++)
{
CString refcopy = shaderenum->GetShader(i);
m_panel->m_TemplateCombo.AddString(refcopy);
}
/*
{
FILE *out=fopen("c:\\temp\\shaders.txt","w");
for(int i=0;i<nCount;i++)
{
CString refcopy = shaderenum->GetShader(i);
fprintf(out,"%s\n",refcopy);
SShader *sshader=GetIEditor()->GetRenderer()->EF_LoadShader(refcopy.GetBuffer(64),-1,eSH_World,0);
if(sshader)
{
TArray<SShaderParam *> &shaderparams=sshader->mfGetPublicParams();
// struct SShaderParam
// string m_Name;
// EParamType m_Type;
// UParamVal m_Value;
int nParamCount=shaderparams.Num();
for(int e=0;e<nParamCount;e++)
{
SShaderParam *ptr=shaderparams[e];
fprintf(out," - %s\n",ptr->m_Name.c_str());
}
// delete sshader;
}
}
fclose(out);
}
*/
m_panel->m_TemplateCombo.SetCurSel(0);
}
//////////////////////////////////////////////////////////////////////////
void CShaderTemplateTool::EndEditParams()
{
if (m_panelId)
{
m_ie->RemoveRollUpPage(ROLLUP_TERRAIN,m_panelId);
m_panel = 0;
}
}
//////////////////////////////////////////////////////////////////////////
bool CShaderTemplateTool::MouseCallback( CViewport *view,EMouseEvent event,CPoint &point,int flags )
{
// m_pointerPos = view->ViewToWorld( point );
if (event == eMouseLDown || (event == eMouseMove && (flags&MK_LBUTTON)))
{
/*
if (flags&MK_CONTROL)
{
bool bMakeHole = m_bMakeHole;
m_bMakeHole = false;
Modify();
m_bMakeHole = bMakeHole;
}
else
{
Modify();
}
*/
// if (!GetIEditor()->IsUndoRecording())
// GetIEditor()->BeginUndo();
// Modify();
}
else
{
// if (GetIEditor()->IsUndoRecording())
// GetIEditor()->AcceptUndo( "Terrain Hole" );
}
return true;
}
//////////////////////////////////////////////////////////////////////////
void CShaderTemplateTool::Display( DisplayContext &dc )
{
}
//////////////////////////////////////////////////////////////////////////
bool CShaderTemplateTool::OnKeyDown( CViewport *view,uint nChar,uint nRepCnt,uint nFlags )
{
bool bProcessed = false;
/* if (nChar == VK_ADD)
{
if (m_brushRadius < 100)
m_brushRadius += 0.5f;
bProcessed = true;
}
if (nChar == VK_SUBTRACT)
{
if (m_brushRadius > 0.5f)
m_brushRadius -= 0.5f;
bProcessed = true;
}
if (nChar == VK_CONTROL && !(nFlags&(1<<14))) // only once (no repeat).
{
m_bMakeHole = !m_bMakeHole;
m_panel->SetMakeHole(m_bMakeHole);
}
if (bProcessed && m_panel)
{
m_panel->m_radius.SetPos(m_brushRadius);
}
*/
return bProcessed;
}
bool CShaderTemplateTool::OnKeyUp( CViewport *view,uint nChar,uint nRepCnt,uint nFlags )
{
/*
if (nChar == VK_CONTROL)
{
m_bMakeHole = !m_bMakeHole;
m_panel->SetMakeHole(m_bMakeHole);
}
*/
return false;
}
//////////////////////////////////////////////////////////////////////////
void CShaderTemplateTool::Modify()
{
/*
float fx1 = (m_pointerPos.y - m_brushRadius)/UNIT_SIZE;
float fy1 = (m_pointerPos.x - m_brushRadius)/UNIT_SIZE;
float fx2 = (m_pointerPos.y + m_brushRadius)/UNIT_SIZE;
float fy2 = (m_pointerPos.x + m_brushRadius)/UNIT_SIZE;
CHeightmap *heightmap = m_ie->GetHeightmap();
int x1 = MAX(fx1,0);
int y1 = MAX(fy1,0);
int x2 = MIN(fx2,heightmap->GetWidth()-1);
int y2 = MIN(fy2,heightmap->GetHeight()-1);
heightmap->MakeHole( x1,y1,x2-x1,y2-y1,m_bMakeHole );
*/
}
/*
// open file open dialog
void CShaderTemplateTool::ChooseInputFile( void )
{
assert(m_ie);
CString file,relFile;
if (CFileUtil::SelectSingleFile( EFILE_TYPE_GEOMETRY,relFile ))
{
OnFileChanged(relFile);
}
}
*/
// refresh the material combobox and callOnMaterialChanged()
void CShaderTemplateTool::OnFileChanged( CString inRelFilename )
{
// todo **************************
/*
m_sFilename=inRelFilename;
XmlParser xml;
XmlNodeRef ref=xml.parse(m_sFilename);
if (ref != 0 && ref->isTag("shadertemplateparameters"))
{
for(int i = 0; i < ref->getChildCount(); i++)
{
XmlNodeRef child = ref->getChild(i);
if(child->isTag("associated"))
{
CString cgfname;
if(child->getAttr( "mesh",cgfname ))
{
}
}
else if(child->isTag("associate"))
{
}
else if(child->isTag("parameterset"))
{
}
}
}
*/
/* I3DEngine *pEngine=m_ie->GetSystem()->GetI3DEngine();
assert(pEngine);
IStatObj *pObject = pEngine->MakeObject( inRelFilename );
{
vector<IStatObj *> objlist;
objlist.push(pObject);
pEngine->SaveCGF(objlist);
}
if (pObject)
m_ie->GetSystem()->GetI3DEngine()->ReleaseObject( m_object );
*/
}
void CShaderTemplateTool::OnBnClickedShadertemplLoad( void )
{
CString file,relFile;
if (CFileUtil::SelectSingleFile( EFILE_TYPE_GEOMETRY,file ))
{
OnFileChanged(m_sFilename);
}
}
void CShaderTemplateTool::OnBnClickedShadertemplSave( void )
{
AfxMessageBox("todo");
}
CString CShaderTemplateTool::getFilename( void )
{
return(m_sFilename);
}