mirror of https://github.com/AxioDL/metaforce.git
More FRME work, implement CScriptRelay
This commit is contained in:
parent
ef63498c61
commit
4b229bac27
|
@ -338,17 +338,45 @@ bool FRME::Extract(const SpecBase &dataSpec,
|
||||||
os << "import bpy, math\n"
|
os << "import bpy, math\n"
|
||||||
"from mathutils import Matrix, Quaternion\n"
|
"from mathutils import Matrix, Quaternion\n"
|
||||||
"bpy.types.Object.retro_widget_type = bpy.props.StringProperty(name='Retro: FRME Widget Type')\n"
|
"bpy.types.Object.retro_widget_type = bpy.props.StringProperty(name='Retro: FRME Widget Type')\n"
|
||||||
|
"model_draw_flags = [\n"
|
||||||
|
" ('RETRO_SHADELESS', 'Shadeless', '', 0),\n"
|
||||||
|
" ('RETRO_OPAQUE', 'Opaque', '', 1),\n"
|
||||||
|
" ('RETRO_ALPHA', 'Alpha', '', 2),\n"
|
||||||
|
" ('RETRO_ADDITIVE', 'Additive', '', 3),\n"
|
||||||
|
" ('RETRO_ALPHA_ADDITIVE_OVERDRAW', 'Alpha Additive Overdraw', '', 4)]\n"
|
||||||
"bpy.types.Object.retro_widget_parent = bpy.props.StringProperty(name='Retro: FRME Widget Parent', description='Refers to internal frame widgets')\n"
|
"bpy.types.Object.retro_widget_parent = bpy.props.StringProperty(name='Retro: FRME Widget Parent', description='Refers to internal frame widgets')\n"
|
||||||
|
"bpy.types.Object.retro_widget_use_anim_controller = bpy.props.BoolProperty(name='Retro: Use Animiation Conroller')\n"
|
||||||
|
"bpy.types.Object.retro_widget_default_visible = bpy.props.BoolProperty(name='Retro: Default Visible', description='Sets widget is visible by default')\n"
|
||||||
|
"bpy.types.Object.retro_widget_default_active = bpy.props.BoolProperty(name='Retro: Default Visible', description='Sets widget is cases by default')\n"
|
||||||
|
"bpy.types.Object.retro_widget_cull_faces = bpy.props.BoolProperty(name='Retro: Default Visible', description='Enables face culling')\n"
|
||||||
|
"bpy.types.Object.retro_widget_color = bpy.props.FloatVectorProperty(name='Retro: Color', description='Sets widget color', subtype='COLOR', size=4, min=0.0, max=1.0)\n"
|
||||||
|
"bpy.types.Object.retro_widget_model_draw_flags = bpy.props.EnumProperty(items=model_draw_flags, name='Retro: Model Draw Flags', default='RETRO_ALPHA')\n"
|
||||||
"# Clear Scene\n"
|
"# Clear Scene\n"
|
||||||
"for ob in bpy.data.objects:\n"
|
"for ob in bpy.data.objects:\n"
|
||||||
" bpy.context.scene.objects.unlink(ob)\n"
|
" bpy.context.scene.objects.unlink(ob)\n"
|
||||||
" bpy.data.objects.remove(ob)\n";
|
" bpy.data.objects.remove(ob)\n"
|
||||||
|
"\n"
|
||||||
|
"def duplicateObject(copy_obj):\n"
|
||||||
|
" # Create new mesh\n"
|
||||||
|
" mesh = bpy.data.meshes.new(copy_obj.name)\n"
|
||||||
|
" # Create new object associated with the mesh\n"
|
||||||
|
" ob_new = bpy.data.objects.new(copy_obj.name, mesh)\n"
|
||||||
|
" # Copy data block from the old object into the new object\n"
|
||||||
|
" ob_new.data = copy_obj.data\n"
|
||||||
|
" ob_new.scale = copy_obj.scale\n"
|
||||||
|
" ob_new.location = copy_obj.location\n"
|
||||||
|
" # Link new object to the given scene and select it\n"
|
||||||
|
" bpy.context.scene.objects.link(ob_new)\n"
|
||||||
|
" return ob_new\n";
|
||||||
|
|
||||||
os.format("bpy.context.scene.name = 'FRME_%s'\n"
|
os.format("bpy.context.scene.name = '%s'\n"
|
||||||
"bpy.context.scene.render.resolution_x = 640\n"
|
"bpy.context.scene.render.resolution_x = 640\n"
|
||||||
"bpy.context.scene.render.resolution_y = 480\n"
|
"bpy.context.scene.render.resolution_y = 480\n"
|
||||||
"bpy.context.scene.render.engine = 'BLENDER_GAME'\n",
|
"bpy.context.scene.render.engine = 'CYCLES'\n"
|
||||||
entry.id.toString().c_str());
|
"bpy.context.scene.world.use_nodes = True\n"
|
||||||
|
"bpy.context.scene.render.engine = 'BLENDER_GAME'\n"
|
||||||
|
"bg_node = bpy.context.scene.world.node_tree.nodes['Background']\n",
|
||||||
|
pakRouter.getBestEntryName(entry).c_str());
|
||||||
|
|
||||||
for (const FRME::Widget& w : frme.widgets)
|
for (const FRME::Widget& w : frme.widgets)
|
||||||
{
|
{
|
||||||
|
@ -359,17 +387,17 @@ bool FRME::Extract(const SpecBase &dataSpec,
|
||||||
using CAMRInfo = Widget::CAMRInfo;
|
using CAMRInfo = Widget::CAMRInfo;
|
||||||
os.format("cam = bpy.data.cameras.new(name='%s')\n"
|
os.format("cam = bpy.data.cameras.new(name='%s')\n"
|
||||||
"binding = cam\n", w.header.name.c_str());
|
"binding = cam\n", w.header.name.c_str());
|
||||||
CAMRInfo* info = dynamic_cast<CAMRInfo*>(w.widgetInfo.get());
|
CAMRInfo* info = static_cast<CAMRInfo*>(w.widgetInfo.get());
|
||||||
if (info)
|
if (info)
|
||||||
{
|
{
|
||||||
if (info->projectionType == CAMRInfo::ProjectionType::Orthographic)
|
if (info->projectionType == CAMRInfo::ProjectionType::Orthographic)
|
||||||
{
|
{
|
||||||
CAMRInfo::OrthographicProjection* proj = dynamic_cast<CAMRInfo::OrthographicProjection*>(info->projection.get());
|
CAMRInfo::OrthographicProjection* proj = static_cast<CAMRInfo::OrthographicProjection*>(info->projection.get());
|
||||||
os.format("cam.type = 'ORTHO'\n");
|
os.format("cam.type = 'ORTHO'\n");
|
||||||
}
|
}
|
||||||
else if (info->projectionType == CAMRInfo::ProjectionType::Perspective)
|
else if (info->projectionType == CAMRInfo::ProjectionType::Perspective)
|
||||||
{
|
{
|
||||||
CAMRInfo::PerspectiveProjection* proj = dynamic_cast<CAMRInfo::PerspectiveProjection*>(info->projection.get());
|
CAMRInfo::PerspectiveProjection* proj = static_cast<CAMRInfo::PerspectiveProjection*>(info->projection.get());
|
||||||
os.format("cam.type = 'PERSP'\n"
|
os.format("cam.type = 'PERSP'\n"
|
||||||
"cam.lens_unit = 'FOV'\n"
|
"cam.lens_unit = 'FOV'\n"
|
||||||
"cam.angle = math.radians(%f)\n"
|
"cam.angle = math.radians(%f)\n"
|
||||||
|
@ -383,20 +411,49 @@ bool FRME::Extract(const SpecBase &dataSpec,
|
||||||
os << "angle = Quaternion((1.0, 0.0, 0.0), math.radians(90.0))\n";
|
os << "angle = Quaternion((1.0, 0.0, 0.0), math.radians(90.0))\n";
|
||||||
}
|
}
|
||||||
else if (w.type == SBIG('LITE'))
|
else if (w.type == SBIG('LITE'))
|
||||||
os.format("lite = bpy.data.lamps.new(name='%s', type='POINT')\n"
|
{
|
||||||
"lite.color = (%f, %f, %f)\n"
|
using LITEInfo = Widget::LITEInfo;
|
||||||
"binding = lite\n",
|
LITEInfo* info = static_cast<LITEInfo*>(w.widgetInfo.get());
|
||||||
|
if (info)
|
||||||
|
{
|
||||||
|
switch(info->type)
|
||||||
|
{
|
||||||
|
case LITEInfo::ELightType::LocalAmbient:
|
||||||
|
os.format("bg_node.inputs[0].default_value = (%f,%f,%f,1.0\n"
|
||||||
|
"bg_node.inputs[1].default_value = %f\n",
|
||||||
|
w.header.color.vec[0], w.header.color.vec[1], w.header.color.vec[2],
|
||||||
|
info->distQ / 8.0);
|
||||||
|
default:
|
||||||
|
os.format("lamp = bpy.data.lamps.new(name='%s', type='POINT')\n"
|
||||||
|
"lamp.color = (%f, %f, %f)\n"
|
||||||
|
"binding = lamp\n",
|
||||||
w.header.name.c_str(),
|
w.header.name.c_str(),
|
||||||
w.header.color.vec[0], w.header.color.vec[1], w.header.color.vec[2]);
|
w.header.color.vec[0], w.header.color.vec[1], w.header.color.vec[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
os.format("frme_obj = bpy.data.objects.new(name='%s', object_data=binding)\n"
|
os.format("frme_obj = bpy.data.objects.new(name='%s', object_data=binding)\n"
|
||||||
"frme_obj.retro_widget_type = '%s'\n"
|
|
||||||
"parentName = '%s'\n"
|
"parentName = '%s'\n"
|
||||||
|
"frme_obj.retro_widget_type = '%s'\n"
|
||||||
|
"frme_obj.retro_widget_use_anim_controller = %s\n"
|
||||||
|
"frme_obj.retro_widget_default_visible = %s\n"
|
||||||
|
"frme_obj.retro_widget_default_active = %s\n"
|
||||||
|
"frme_obj.retro_widget_cull_faces = %s\n"
|
||||||
|
"frme_obj.retro_widget_color = (%f,%f,%f,%f)\n"
|
||||||
|
"frme_obj.retro_widget_model_draw_flags = model_draw_flags[%i][0]\n"
|
||||||
"if parentName not in bpy.data.objects:\n"
|
"if parentName not in bpy.data.objects:\n"
|
||||||
" frme_obj.retro_widget_parent = parentName\n"
|
" frme_obj.retro_widget_parent = parentName\n"
|
||||||
"else:\n"
|
"else:\n"
|
||||||
" frme_obj.parent = bpy.data.objects[parentName]\n",
|
" frme_obj.parent = bpy.data.objects[parentName]\n",
|
||||||
w.header.name.c_str(), w.type.toString().c_str(), w.header.parent.c_str());
|
w.header.name.c_str(), w.header.parent.c_str(),
|
||||||
|
w.type.toString().c_str(),
|
||||||
|
w.header.useAnimController ? "True" : "False",
|
||||||
|
w.header.defaultVisible ? "True" : "False",
|
||||||
|
w.header.defaultActive ? "True" : "False",
|
||||||
|
w.header.cullFaces ? "True" : "False",
|
||||||
|
w.header.color.vec[0], w.header.color.vec[1], w.header.color.vec[2], w.header.color.vec[3],
|
||||||
|
w.header.modelDrawFlags);
|
||||||
|
|
||||||
if (w.type == SBIG('MODL'))
|
if (w.type == SBIG('MODL'))
|
||||||
{
|
{
|
||||||
|
@ -406,13 +463,12 @@ bool FRME::Extract(const SpecBase &dataSpec,
|
||||||
const PAKRouter<PAKBridge>::EntryType* cmdlE = pakRouter.lookupEntry(info->model, nullptr, true, true);
|
const PAKRouter<PAKBridge>::EntryType* cmdlE = pakRouter.lookupEntry(info->model, nullptr, true, true);
|
||||||
|
|
||||||
os.linkBlend(modelPath.getAbsolutePathUTF8().c_str(),
|
os.linkBlend(modelPath.getAbsolutePathUTF8().c_str(),
|
||||||
pakRouter.getBestEntryName(*cmdlE).c_str(), false);
|
pakRouter.getBestEntryName(*cmdlE).c_str(), true);
|
||||||
|
|
||||||
os << "print(obj.name)\n"
|
os << "print(obj.name)\n"
|
||||||
"if obj.name not in bpy.context.scene.objects:\n"
|
"copy_obj = duplicateObject(obj)\n"
|
||||||
" bpy.context.scene.objects.link(obj)\n"
|
"copy_obj.parent = frme_obj\n"
|
||||||
"obj.parent = frme_obj\n"
|
"copy_obj.hide = False\n";
|
||||||
"obj.hide = False\n";
|
|
||||||
}
|
}
|
||||||
else if (w.type == SBIG('IMGP'))
|
else if (w.type == SBIG('IMGP'))
|
||||||
{
|
{
|
||||||
|
|
|
@ -135,6 +135,10 @@ class CStateManager
|
||||||
void UpdateThermalVisor();
|
void UpdateThermalVisor();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/* TODO: Figure out what this is
|
||||||
|
* Public for CScriptRelay
|
||||||
|
*/
|
||||||
|
TUniqueId xf76_ = kInvalidUniqueId;
|
||||||
enum class EScriptPersistence
|
enum class EScriptPersistence
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
|
@ -58,7 +58,7 @@ void CActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMana
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EScriptObjectMessage::InternalMessage13: // 34
|
case EScriptObjectMessage::InternalMessage12: // 34
|
||||||
{
|
{
|
||||||
RemoveEmitter();
|
RemoveEmitter();
|
||||||
/* TODO: Not sure about this
|
/* TODO: Not sure about this
|
||||||
|
@ -67,7 +67,7 @@ void CActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMana
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EScriptObjectMessage::InternalMessage14: // 35
|
case EScriptObjectMessage::InternalMessage13: // 35
|
||||||
{
|
{
|
||||||
for (const SConnection& conn : x20_conns)
|
for (const SConnection& conn : x20_conns)
|
||||||
{
|
{
|
||||||
|
@ -80,10 +80,10 @@ void CActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMana
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EScriptObjectMessage::InternalMessage16: // 37
|
case EScriptObjectMessage::InternalMessage15: // 37
|
||||||
SetInFluid(true, uid);
|
SetInFluid(true, uid);
|
||||||
break;
|
break;
|
||||||
case EScriptObjectMessage::InternalMessage18: // 39
|
case EScriptObjectMessage::InternalMessage17: // 39
|
||||||
SetInFluid(false, kInvalidUniqueId);
|
SetInFluid(false, kInvalidUniqueId);
|
||||||
break;
|
break;
|
||||||
default:break;
|
default:break;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "CScriptRelay.hpp"
|
#include "CScriptRelay.hpp"
|
||||||
|
#include "CStateManager.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
@ -11,6 +12,64 @@ CScriptRelay::CScriptRelay(TUniqueId uid, const std::string& name, const CEntity
|
||||||
void CScriptRelay::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr)
|
void CScriptRelay::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr)
|
||||||
{
|
{
|
||||||
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
|
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
|
||||||
|
if (msg == EScriptObjectMessage::InternalMessage12)
|
||||||
|
{
|
||||||
|
UpdateObjectRef(stateMgr);
|
||||||
|
}
|
||||||
|
else if (msg == EScriptObjectMessage::SetToZero)
|
||||||
|
{
|
||||||
|
if (x30_24_active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
x38_++;
|
||||||
|
TUniqueId tmp = stateMgr.xf76_;
|
||||||
|
while (tmp != kInvalidUniqueId)
|
||||||
|
{
|
||||||
|
const CEntity* obj = stateMgr.GetObjectById(tmp);
|
||||||
|
if (!obj)
|
||||||
|
{
|
||||||
|
tmp = x34_;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj->GetUniqueId() == tmp)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp == kInvalidUniqueId)
|
||||||
|
return;
|
||||||
|
x34_ = stateMgr.xf76_;
|
||||||
|
stateMgr.xf76_ = GetUniqueId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CScriptRelay::Think(float, CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
if (x38_ == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (x38_ != 0)
|
||||||
|
{
|
||||||
|
x38_--;
|
||||||
|
SendScriptMsgs(EScriptObjectState::Zero, stateMgr, EScriptObjectMessage::None);
|
||||||
|
}
|
||||||
|
UpdateObjectRef(stateMgr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CScriptRelay::UpdateObjectRef(CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
TUniqueId* tmp = &stateMgr.xf76_;
|
||||||
|
while (*tmp != kInvalidUniqueId && tmp != nullptr)
|
||||||
|
{
|
||||||
|
if (*tmp == GetUniqueId())
|
||||||
|
{
|
||||||
|
*tmp = x34_;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const CScriptRelay* obj = dynamic_cast<const CScriptRelay*>(stateMgr.GetObjectById(*tmp));
|
||||||
|
if (obj)
|
||||||
|
tmp = (TUniqueId*)&obj->x34_;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@ public:
|
||||||
CScriptRelay(TUniqueId, const std::string&, const CEntityInfo&, bool);
|
CScriptRelay(TUniqueId, const std::string&, const CEntityInfo&, bool);
|
||||||
|
|
||||||
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr);
|
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr);
|
||||||
|
void Think(float, CStateManager& stateMgr);
|
||||||
|
void UpdateObjectRef(CStateManager& stateMgr);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -211,12 +211,12 @@ enum class EScriptObjectMessage
|
||||||
InternalMessage09,
|
InternalMessage09,
|
||||||
InternalMessage10,
|
InternalMessage10,
|
||||||
InternalMessage11,
|
InternalMessage11,
|
||||||
|
InternalMessage12,
|
||||||
InternalMessage13,
|
InternalMessage13,
|
||||||
InternalMessage14,
|
InternalMessage14,
|
||||||
InternalMessage15,
|
InternalMessage15,
|
||||||
InternalMessage16,
|
InternalMessage16,
|
||||||
InternalMessage17,
|
InternalMessage17
|
||||||
InternalMessage18
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue