Added FX Materials
* Added FX Shader Materials * Added Projector Actor
This commit is contained in:
@@ -1,6 +1,44 @@
|
||||
#ifndef RC_ACTOR_MATERIAL_H_INCLUDED
|
||||
#define RC_ACTOR_MATERIAL_H_INCLUDED
|
||||
|
||||
#include "rc_fx_materials.h"
|
||||
|
||||
//Create FX Material in given material slot
|
||||
// Return
|
||||
bool createShaderMaterial(int material_id, int fx_material_type)
|
||||
{
|
||||
if(material_id < 0 || material_id >= rc_material.size())
|
||||
return false;
|
||||
|
||||
if(!rc_material[material_id].isUsed)
|
||||
return false;
|
||||
|
||||
if(fx_material_type < RC_FX_MATERIAL_BASE_INDEX || fx_material_type >= (RC_FX_MATERIAL_BASE_INDEX + rc_shader_materials.size()))
|
||||
return false;
|
||||
|
||||
if(rc_material[material_id].shader)
|
||||
{
|
||||
delete rc_material[material_id].shader;
|
||||
rc_material[material_id].shader = NULL;
|
||||
}
|
||||
|
||||
rc_material[material_id].isFX = false;
|
||||
|
||||
int shader_index = fx_material_type - RC_FX_MATERIAL_BASE_INDEX;
|
||||
|
||||
//std::cout << "Shader Index = " << shader_index << std::endl;
|
||||
|
||||
rc_material[material_id].shader = new CShader(device, rc_shader_materials[shader_index]);
|
||||
|
||||
if(rc_material[material_id].shader)
|
||||
{
|
||||
rc_material[material_id].fxMatType = fx_material_type;
|
||||
rc_material[material_id].isFX = true;
|
||||
}
|
||||
|
||||
return rc_material[material_id].isFX;
|
||||
}
|
||||
|
||||
//set actor texture
|
||||
void rc_setActorTexture(int actor, int layer, int image_id)
|
||||
{
|
||||
@@ -64,8 +102,11 @@ void rc_setActorMaterialType(int actor, int material_type)
|
||||
if(!rc_actor[actor].mesh_node)
|
||||
return;
|
||||
|
||||
irr::video::E_MATERIAL_TYPE n = (irr::video::E_MATERIAL_TYPE) material_type;
|
||||
rc_actor[actor].mesh_node->setMaterialType(n);
|
||||
if(material_type >= 0 && material_type < MAX_DEFAULT_MATERIALS)
|
||||
{
|
||||
irr::video::E_MATERIAL_TYPE n = (irr::video::E_MATERIAL_TYPE) material_type;
|
||||
rc_actor[actor].mesh_node->setMaterialType(n);
|
||||
}
|
||||
}
|
||||
|
||||
//Set Actor Material Type
|
||||
@@ -77,7 +118,23 @@ int rc_getActorMaterialType(int actor, int material)
|
||||
if(!rc_actor[actor].mesh_node)
|
||||
return 0;
|
||||
|
||||
return (int)rc_actor[actor].mesh_node->getMaterial(material).MaterialType;
|
||||
int material_type = (int)rc_actor[actor].mesh_node->getMaterial(material).MaterialType;
|
||||
|
||||
if(material_type >= 0 && material_type < MAX_DEFAULT_MATERIALS)
|
||||
return material_type;
|
||||
else
|
||||
{
|
||||
//loop through all the fx materials on the actor
|
||||
for(int i = 0; i < rc_actor[actor].actor_fx_materials.size(); i++)
|
||||
{
|
||||
if(rc_actor[actor].actor_fx_materials[i].inUse && rc_actor[actor].actor_fx_materials[i].actor_material_index == material)
|
||||
{
|
||||
int material_id = rc_actor[actor].actor_fx_materials[i].material_id;
|
||||
return rc_material[material_id].fxMatType;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rc_createMaterial()
|
||||
@@ -89,6 +146,12 @@ int rc_createMaterial()
|
||||
if(!rc_material[i].isUsed)
|
||||
{
|
||||
material_id = i;
|
||||
rc_material[i].isFX = false;
|
||||
if(rc_material[i].shader)
|
||||
{
|
||||
delete rc_material[i].shader;
|
||||
rc_material[i].shader = NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -99,6 +162,8 @@ int rc_createMaterial()
|
||||
rc_material_obj mat;
|
||||
mat.isUsed = true;
|
||||
mat.isReference = false;
|
||||
mat.isFX = false;
|
||||
mat.shader = NULL;
|
||||
rc_material.push_back(mat);
|
||||
}
|
||||
|
||||
@@ -110,8 +175,43 @@ void rc_deleteMaterial(int material_id)
|
||||
if(material_id < 0 || material_id >= rc_material.size())
|
||||
return;
|
||||
|
||||
if(rc_material[material_id].isFX)
|
||||
{
|
||||
//loop through the FX materials in every actor to remove this material
|
||||
for(int i = 0; i < rc_actor.size(); i++)
|
||||
{
|
||||
if(!rc_actor[i].mesh_node)
|
||||
continue;
|
||||
|
||||
for(int fx_mat = 0; fx_mat < rc_actor[i].actor_fx_materials.size(); fx_mat++)
|
||||
{
|
||||
int m_id = rc_actor[i].actor_fx_materials[fx_mat].material_id;
|
||||
|
||||
if(m_id < 0 || m_id >= rc_actor[i].mesh_node->getMaterialCount())
|
||||
continue;
|
||||
|
||||
if(m_id == material_id && rc_actor[i].actor_fx_materials[fx_mat].inUse)
|
||||
{
|
||||
int actor_mat_index = rc_actor[i].actor_fx_materials[fx_mat].actor_material_index;
|
||||
irr::video::SMaterial m;
|
||||
m.MaterialType = irr::video::EMT_SOLID;
|
||||
rc_actor[i].mesh_node->getMaterial(actor_mat_index) = m;
|
||||
rc_actor[i].actor_fx_materials[fx_mat].inUse = false;
|
||||
rc_actor[i].actor_fx_materials[fx_mat].material_id = -1;
|
||||
rc_actor[i].actor_fx_materials[fx_mat].actor_material_index = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(rc_material[material_id].shader)
|
||||
delete rc_material[material_id].shader;
|
||||
rc_material[material_id].shader = NULL;
|
||||
}
|
||||
|
||||
rc_material[material_id].isUsed = false;
|
||||
rc_material[material_id].mat = irr::video::SMaterial();
|
||||
rc_material[material_id].isFX = false;
|
||||
rc_material[material_id].fxMatType = -1;
|
||||
}
|
||||
|
||||
//Set Actor Material Type
|
||||
@@ -128,14 +228,65 @@ void rc_setActorMaterial(int actor, int material_num, int material_id)
|
||||
|
||||
if(rc_material[material_id].isUsed)
|
||||
{
|
||||
if(rc_material[material_id].isReference)
|
||||
if(rc_material[material_id].isFX)
|
||||
{
|
||||
if(rc_material[material_id].shader)
|
||||
{
|
||||
rc_actor[actor].mesh_node->getMaterial(material_num).MaterialType = (video::E_MATERIAL_TYPE)rc_material[material_id].shader->getMaterial();
|
||||
rc_material[material_id].shader->setObjectNode(rc_actor[actor].mesh_node);
|
||||
|
||||
registerSceneNodeForRTT(VideoDriver, rc_actor[actor].mesh_node, rc_material[material_id].shader->getRTTInfo(ERT_VIEW));
|
||||
|
||||
int fx_index = -1;
|
||||
int vacant_index = -1;
|
||||
for(int i = 0; i < rc_actor[actor].actor_fx_materials.size(); i++)
|
||||
{
|
||||
if(rc_actor[actor].actor_fx_materials[i].actor_material_index == material_num &&
|
||||
rc_actor[actor].actor_fx_materials[i].inUse)
|
||||
{
|
||||
fx_index = i;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!rc_actor[actor].actor_fx_materials[i].inUse)
|
||||
vacant_index = i;
|
||||
}
|
||||
|
||||
if(fx_index < 0)
|
||||
fx_index = vacant_index;
|
||||
|
||||
if(fx_index < 0)
|
||||
{
|
||||
rc_actor_fx_material_obj actor_fx_mat;
|
||||
actor_fx_mat.actor_material_index = material_num;
|
||||
actor_fx_mat.inUse = true;
|
||||
actor_fx_mat.material_id = material_id;
|
||||
rc_actor[actor].actor_fx_materials.push_back(actor_fx_mat);
|
||||
}
|
||||
else
|
||||
{
|
||||
rc_actor[actor].actor_fx_materials[fx_index].actor_material_index = material_num;
|
||||
rc_actor[actor].actor_fx_materials[fx_index].inUse = true;
|
||||
rc_actor[actor].actor_fx_materials[fx_index].material_id = material_id;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//shader is null then I might as well make sure this material is vacant
|
||||
rc_material[material_id].isFX = false;
|
||||
rc_material[material_id].isUsed = false;
|
||||
}
|
||||
}
|
||||
else if(rc_material[material_id].isReference)
|
||||
{
|
||||
int refActor = rc_material[material_id].refActor;
|
||||
int refMatNum = rc_material[material_id].refMatNum;
|
||||
rc_actor[actor].mesh_node->getMaterial(material_num) = rc_actor[ refActor ].mesh_node->getMaterial( refMatNum );
|
||||
}
|
||||
else
|
||||
{
|
||||
rc_actor[actor].mesh_node->getMaterial(material_num) = rc_material[material_id].mat;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,6 +322,25 @@ int rc_copyActorMaterial(int actor, int material_num)
|
||||
else
|
||||
rc_material[material_id].mat = rc_actor[actor].mesh_node->getMaterial(material_num);
|
||||
|
||||
//Check if material is fx
|
||||
for(int i = 0; i < rc_actor[actor].actor_fx_materials.size(); i++)
|
||||
{
|
||||
if(!rc_actor[actor].actor_fx_materials[i].inUse)
|
||||
continue;
|
||||
|
||||
if(rc_actor[actor].actor_fx_materials[i].actor_material_index == material_num)
|
||||
{
|
||||
int fx_mat_id = rc_actor[actor].actor_fx_materials[i].material_id;
|
||||
|
||||
if(fx_mat_id >= 0 && fx_mat_id < rc_material.size())
|
||||
{
|
||||
rc_material[material_id].fxMatType = rc_material[fx_mat_id].fxMatType;
|
||||
rc_material[material_id].isFX = true;
|
||||
rc_material[material_id].shader = rc_material[fx_mat_id].shader;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return material_id;
|
||||
}
|
||||
|
||||
@@ -178,6 +348,9 @@ int rc_copyMaterial(int src_material_id)
|
||||
{
|
||||
int material_id = -1;
|
||||
|
||||
if(!rc_material[src_material_id].isUsed)
|
||||
return -1;
|
||||
|
||||
for(int i = 0; i < rc_material.size(); i++)
|
||||
{
|
||||
if(!rc_material[i].isUsed)
|
||||
@@ -203,6 +376,59 @@ int rc_copyMaterial(int src_material_id)
|
||||
else
|
||||
rc_material[material_id] = nmat;
|
||||
|
||||
if(rc_material[src_material_id].isFX)
|
||||
{
|
||||
if(!rc_material[src_material_id].shader)
|
||||
{
|
||||
rc_material[material_id].isUsed = false;
|
||||
rc_material[material_id].isReference = false;
|
||||
rc_material[material_id].isFX = false;
|
||||
rc_material[material_id].shader = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!createShaderMaterial(material_id, rc_material[src_material_id].fxMatType))
|
||||
{
|
||||
rc_material[material_id].isUsed = false;
|
||||
rc_material[material_id].isReference = false;
|
||||
rc_material[material_id].isFX = false;
|
||||
rc_material[material_id].shader = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
//Copy all the uniforms
|
||||
for(int i = 0; i < rc_material[src_material_id].shader->getUniformVariableCount(); i++)
|
||||
{
|
||||
rc_material[material_id].shader->getUniformVariable(i)->b_frag_var = rc_material[src_material_id].shader->getUniformVariable(i)->b_frag_var;
|
||||
rc_material[material_id].shader->getUniformVariable(i)->name = rc_material[src_material_id].shader->getUniformVariable(i)->name;
|
||||
rc_material[material_id].shader->getUniformVariable(i)->predefinition = rc_material[src_material_id].shader->getUniformVariable(i)->predefinition;
|
||||
rc_material[material_id].shader->getUniformVariable(i)->type = rc_material[src_material_id].shader->getUniformVariable(i)->type;
|
||||
|
||||
switch(rc_material[material_id].shader->getUniformVariable(i)->type)
|
||||
{
|
||||
case ESVT_SAMPLER2D:
|
||||
case ESVT_FLOAT:
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[0] = rc_material[src_material_id].shader->getUniformVariable(i)->value[0];
|
||||
break;
|
||||
case ESVT_VEC2:
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[0] = rc_material[src_material_id].shader->getUniformVariable(i)->value[0];
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[1] = rc_material[src_material_id].shader->getUniformVariable(i)->value[1];
|
||||
break;
|
||||
case ESVT_VEC3:
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[0] = rc_material[src_material_id].shader->getUniformVariable(i)->value[0];
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[1] = rc_material[src_material_id].shader->getUniformVariable(i)->value[1];
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[2] = rc_material[src_material_id].shader->getUniformVariable(i)->value[2];
|
||||
break;
|
||||
case ESVT_VEC4:
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[0] = rc_material[src_material_id].shader->getUniformVariable(i)->value[0];
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[1] = rc_material[src_material_id].shader->getUniformVariable(i)->value[1];
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[2] = rc_material[src_material_id].shader->getUniformVariable(i)->value[2];
|
||||
rc_material[material_id].shader->getUniformVariable(i)->value[3] = rc_material[src_material_id].shader->getUniformVariable(i)->value[3];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return material_id;
|
||||
}
|
||||
|
||||
@@ -237,6 +463,31 @@ int rc_getActorMaterial(int actor, int material_num)
|
||||
nmat.isReference = true;
|
||||
nmat.refActor = actor;
|
||||
nmat.refMatNum = material_num;
|
||||
|
||||
//Check if this material number is FX
|
||||
for(int i = 0; i < rc_actor[actor].actor_fx_materials.size(); i++)
|
||||
{
|
||||
if(!rc_actor[actor].actor_fx_materials[i].inUse)
|
||||
continue;
|
||||
|
||||
int actor_material_index = rc_actor[actor].actor_fx_materials[i].actor_material_index;
|
||||
|
||||
if(actor_material_index == material_num)
|
||||
{
|
||||
int fx_mat_id = rc_actor[actor].actor_fx_materials[i].material_id;
|
||||
|
||||
if(fx_mat_id >= 0 && fx_mat_id < rc_material.size())
|
||||
{
|
||||
if(rc_material[fx_mat_id].isUsed && rc_material[fx_mat_id].isFX)
|
||||
{
|
||||
nmat.isFX = true;
|
||||
nmat.fxMatType = rc_material[fx_mat_id].fxMatType;
|
||||
nmat.shader = rc_material[fx_mat_id].shader;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rc_material.push_back(nmat);
|
||||
}
|
||||
else
|
||||
@@ -247,6 +498,30 @@ int rc_getActorMaterial(int actor, int material_num)
|
||||
nmat.refActor = actor;
|
||||
nmat.refMatNum = material_num;
|
||||
rc_material[material_id] = nmat;
|
||||
|
||||
//Check if this material number is FX
|
||||
for(int i = 0; i < rc_actor[actor].actor_fx_materials.size(); i++)
|
||||
{
|
||||
if(!rc_actor[actor].actor_fx_materials[i].inUse)
|
||||
continue;
|
||||
|
||||
int actor_material_index = rc_actor[actor].actor_fx_materials[i].actor_material_index;
|
||||
|
||||
if(actor_material_index == material_num)
|
||||
{
|
||||
int fx_mat_id = rc_actor[actor].actor_fx_materials[i].material_id;
|
||||
|
||||
if(fx_mat_id >= 0 && fx_mat_id < rc_material.size())
|
||||
{
|
||||
if(rc_material[fx_mat_id].isUsed && rc_material[fx_mat_id].isFX)
|
||||
{
|
||||
rc_material[material_id].isFX = true;
|
||||
rc_material[material_id].fxMatType = rc_material[fx_mat_id].fxMatType;
|
||||
rc_material[material_id].shader = rc_material[fx_mat_id].shader;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return material_id;
|
||||
@@ -706,14 +981,31 @@ void rc_setMaterialType(int material_id, int mat_type)
|
||||
if(material_id < 0 || material_id >= rc_material.size())
|
||||
return;
|
||||
|
||||
if(rc_material[material_id].isReference)
|
||||
if(!rc_material[material_id].isUsed)
|
||||
return;
|
||||
|
||||
if(mat_type >= RC_FX_MATERIAL_BASE_INDEX && mat_type < (RC_FX_MATERIAL_BASE_INDEX + rc_shader_materials.size()))
|
||||
{
|
||||
int refActor = rc_material[material_id].refActor;
|
||||
int refMatNum = rc_material[material_id].refMatNum;
|
||||
rc_actor[refActor].mesh_node->getMaterial(refMatNum).MaterialType = (irr::video::E_MATERIAL_TYPE)mat_type;
|
||||
if(rc_material[material_id].isReference)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
createShaderMaterial(material_id, mat_type);
|
||||
}
|
||||
}
|
||||
else
|
||||
rc_material[material_id].mat.MaterialType = (irr::video::E_MATERIAL_TYPE)mat_type;
|
||||
{
|
||||
if(rc_material[material_id].isReference)
|
||||
{
|
||||
int refActor = rc_material[material_id].refActor;
|
||||
int refMatNum = rc_material[material_id].refMatNum;
|
||||
rc_actor[refActor].mesh_node->getMaterial(refMatNum).MaterialType = (irr::video::E_MATERIAL_TYPE)mat_type;
|
||||
}
|
||||
else
|
||||
rc_material[material_id].mat.MaterialType = (irr::video::E_MATERIAL_TYPE)mat_type;
|
||||
}
|
||||
}
|
||||
|
||||
int rc_getMaterialType(int material_id)
|
||||
@@ -725,10 +1017,46 @@ int rc_getMaterialType(int material_id)
|
||||
{
|
||||
int refActor = rc_material[material_id].refActor;
|
||||
int refMatNum = rc_material[material_id].refMatNum;
|
||||
|
||||
//Check if material is an fx material
|
||||
for(int i = 0; i < rc_actor[refActor].actor_fx_materials.size(); i++)
|
||||
{
|
||||
if(!rc_actor[refActor].actor_fx_materials[i].inUse)
|
||||
continue;
|
||||
|
||||
if(rc_actor[refActor].actor_fx_materials[i].material_id == material_id)
|
||||
{
|
||||
if(material_id >= 0 && material_id < rc_material.size())
|
||||
{
|
||||
if(rc_material[material_id].isFX)
|
||||
return rc_material[material_id].fxMatType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(rc_material[material_id].isFX)
|
||||
{
|
||||
int n = rc_actor[refActor].actor_fx_materials[0].material_id;
|
||||
if(n >= 0 && n < rc_material.size())
|
||||
{
|
||||
if(rc_material[n].isUsed)
|
||||
return rc_material[n].fxMatType;
|
||||
}
|
||||
|
||||
//std::cout << "yolo: " << rc_material[n].fxMatType << " ~ " << material_id << std::endl;
|
||||
}
|
||||
|
||||
return (int)rc_actor[refActor].mesh_node->getMaterial(refMatNum).MaterialType;
|
||||
}
|
||||
else
|
||||
return (int)rc_material[material_id].mat.MaterialType;
|
||||
{
|
||||
if(rc_material[material_id].isFX)
|
||||
{
|
||||
return rc_material[material_id].fxMatType;
|
||||
}
|
||||
else
|
||||
return (int)rc_material[material_id].mat.MaterialType;
|
||||
}
|
||||
}
|
||||
|
||||
void rc_setMaterialNormalize(int material_id, bool flag)
|
||||
|
||||
Reference in New Issue
Block a user