Sfoglia il codice sorgente

Add script component foundations

Daniele Bartolini 9 anni fa
parent
commit
3fc6a7b362

+ 34 - 3
src/resource/unit_compiler.cpp

@@ -118,7 +118,10 @@ static Buffer compile_mesh_renderer(const char* json, CompileOptions& opts)
 
 	DynamicString mesh_resource(ta);
 	sjson::parse_string(obj["mesh_resource"], mesh_resource);
-	RESOURCE_COMPILER_ASSERT_RESOURCE_EXISTS(RESOURCE_EXTENSION_MESH, mesh_resource.c_str(), opts);
+	RESOURCE_COMPILER_ASSERT_RESOURCE_EXISTS(RESOURCE_EXTENSION_MESH
+		, mesh_resource.c_str()
+		, opts
+		);
 
 	MeshRendererDesc mrd;
 	mrd.mesh_resource     = sjson::parse_resource_id(obj["mesh_resource"]);
@@ -139,7 +142,10 @@ static Buffer compile_sprite_renderer(const char* json, CompileOptions& opts)
 
 	DynamicString sprite_resource(ta);
 	sjson::parse_string(obj["sprite_resource"], sprite_resource);
-	RESOURCE_COMPILER_ASSERT_RESOURCE_EXISTS(RESOURCE_EXTENSION_SPRITE, sprite_resource.c_str(), opts);
+	RESOURCE_COMPILER_ASSERT_RESOURCE_EXISTS(RESOURCE_EXTENSION_SPRITE
+		, sprite_resource.c_str()
+		, opts
+		);
 
 	SpriteRendererDesc srd;
 	srd.sprite_resource   = sjson::parse_resource_id(obj["sprite_resource"]);
@@ -179,6 +185,27 @@ static Buffer compile_light(const char* json, CompileOptions& opts)
 	return buf;
 }
 
+static Buffer compile_script(const char* json, CompileOptions& opts)
+{
+	TempAllocator4096 ta;
+	JsonObject obj(ta);
+	sjson::parse(json, obj);
+
+	DynamicString script_resource(ta);
+	sjson::parse_string(obj["script_resource"], script_resource);
+	RESOURCE_COMPILER_ASSERT_RESOURCE_EXISTS(RESOURCE_EXTENSION_SCRIPT
+		, script_resource.c_str()
+		, opts
+		);
+
+	ScriptDesc sd;
+	sd.script_resource = sjson::parse_resource_id(obj["script_resource"]);
+
+	Buffer buf(default_allocator());
+	array::push(buf, (char*)&sd, sizeof(sd));
+	return buf;
+}
+
 UnitCompiler::UnitCompiler(CompileOptions& opts)
 	: _opts(opts)
 	, _num_units(0)
@@ -190,6 +217,7 @@ UnitCompiler::UnitCompiler(CompileOptions& opts)
 	register_component_compiler("mesh_renderer",   &compile_mesh_renderer,                         1.0f);
 	register_component_compiler("sprite_renderer", &compile_sprite_renderer,                       1.0f);
 	register_component_compiler("light",           &compile_light,                                 1.0f);
+	register_component_compiler("script",          &compile_script,                                1.0f);
 	register_component_compiler("controller",      &physics_resource_internal::compile_controller, 1.0f);
 	register_component_compiler("collider",        &physics_resource_internal::compile_collider,   1.0f);
 	register_component_compiler("actor",           &physics_resource_internal::compile_actor,      2.0f);
@@ -229,7 +257,10 @@ void UnitCompiler::compile_unit_from_json(const char* json)
 		TempAllocator512 ta;
 		DynamicString path(ta);
 		sjson::parse_string(prefab["prefab"], path);
-		RESOURCE_COMPILER_ASSERT_RESOURCE_EXISTS(RESOURCE_EXTENSION_UNIT, path.c_str(), _opts);
+		RESOURCE_COMPILER_ASSERT_RESOURCE_EXISTS(RESOURCE_EXTENSION_UNIT
+			, path.c_str()
+			, _opts
+			);
 		path += "." RESOURCE_EXTENSION_UNIT;
 
 		Buffer buf = read_unit(path.c_str());

+ 8 - 0
src/world/world.cpp

@@ -603,6 +603,14 @@ void spawn_units(World& w, const UnitResource& ur, const Vector3& pos, const Qua
 				render_world->light_create(unit_lookup[unit_index[i]], *ld, tm);
 			}
 		}
+		else if (component->type == COMPONENT_TYPE_SCRIPT)
+		{
+			const ScriptDesc* sd = (const ScriptDesc*)data;
+			for (u32 i = 0; i < component->num_instances; ++i, ++sd)
+			{
+				CE_FATAL("Not implemented");
+			}
+		}
 		else
 		{
 			CE_FATAL("Unknown component type");

+ 9 - 0
src/world/world_types.h

@@ -44,6 +44,7 @@ const StringId32 COMPONENT_TYPE_LIGHT           = StringId32("light");
 const StringId32 COMPONENT_TYPE_MESH_RENDERER   = StringId32("mesh_renderer");
 const StringId32 COMPONENT_TYPE_SPRITE_RENDERER = StringId32("sprite_renderer");
 const StringId32 COMPONENT_TYPE_TRANSFORM       = StringId32("transform");
+const StringId32 COMPONENT_TYPE_SCRIPT          = StringId32("script");
 
 /// Enumerates camera projection types.
 ///
@@ -339,6 +340,14 @@ struct LightDesc
 	Vector3 color;  ///< Color of the light.
 };
 
+/// Script description.
+///
+/// @ingroup World
+struct ScriptDesc
+{
+	StringId64 script_resource; ///< Name of .lua resource.
+};
+
 /// Transform description.
 ///
 /// @ingroup World

+ 28 - 0
tools/level_editor/properties_view.vala

@@ -308,6 +308,33 @@ namespace Crown
 		}
 	}
 
+	public class ScriptComponentView : ComponentView
+	{
+		// Data
+		Level _level;
+
+		// Widgets
+		private Gtk.Entry _script_resource;
+
+		public ScriptComponentView(Level level)
+		{
+			// Data
+			_level = level;
+
+			// Widgets
+			_script_resource = new Gtk.Entry();
+			_script_resource.sensitive = false;
+
+			uint row = 0;
+			attach_row(row++, "Script", _script_resource);
+		}
+
+		public override void update()
+		{
+			_script_resource.text = (string)_level.get_component_property(_unit_id, _component_id, "data.script_resource");
+		}
+	}
+
 	public class SoundTransformView : ComponentView
 	{
 		// Data
@@ -448,6 +475,7 @@ namespace Crown
 			add_component_view("Camera",          "camera",          2, new CameraComponentView(_level));
 			add_component_view("Mesh Renderer",   "mesh_renderer",   3, new MeshRendererComponentView(_level));
 			add_component_view("Sprite Renderer", "sprite_renderer", 3, new SpriteRendererComponentView(_level));
+			add_component_view("Script",          "script",          3, new ScriptComponentView(_level));
 
 			// Sound
 			add_component_view("Transform",        "sound_transform",  0, new SoundTransformView(_level));