Skip to content

Commit e324727

Browse files
luigi-rossoluigi-rosso
andcommitted
feature: blob asset! (#11554) fdaec2ec5d
Co-authored-by: Luigi Rosso <luigi-rosso@users.noreply.github.com>
1 parent 19b1f2d commit e324727

11 files changed

Lines changed: 228 additions & 19 deletions

File tree

.rive_head

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12f56c871a115c724b28fbdc2a84d33d5d3930b6
1+
fdaec2ec5d2997855acac4b7a3fc791ae4eaa953

include/rive/assets/blob_asset.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef _RIVE_BLOB_ASSET_HPP_
2+
#define _RIVE_BLOB_ASSET_HPP_
3+
#include "rive/generated/assets/blob_asset_base.hpp"
4+
#include "rive/simple_array.hpp"
5+
6+
namespace rive
7+
{
8+
class BlobAsset : public BlobAssetBase
9+
{
10+
public:
11+
bool decode(SimpleArray<uint8_t>&, Factory*) override;
12+
std::string fileExtension() const override;
13+
14+
Span<const uint8_t> bytes() const { return m_bytes; }
15+
16+
private:
17+
SimpleArray<uint8_t> m_bytes;
18+
};
19+
} // namespace rive
20+
21+
#endif
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ifndef _RIVE_BLOB_ASSET_BASE_HPP_
2+
#define _RIVE_BLOB_ASSET_BASE_HPP_
3+
#include "rive/assets/file_asset.hpp"
4+
namespace rive
5+
{
6+
class BlobAssetBase : public FileAsset
7+
{
8+
protected:
9+
typedef FileAsset Super;
10+
11+
public:
12+
static const uint16_t typeKey = 649;
13+
14+
/// Helper to quickly determine if a core object extends another without
15+
/// RTTI at runtime.
16+
bool isTypeOf(uint16_t typeKey) const override
17+
{
18+
switch (typeKey)
19+
{
20+
case BlobAssetBase::typeKey:
21+
case FileAssetBase::typeKey:
22+
case AssetBase::typeKey:
23+
return true;
24+
default:
25+
return false;
26+
}
27+
}
28+
29+
uint16_t coreType() const override { return typeKey; }
30+
31+
Core* clone() const override;
32+
33+
protected:
34+
};
35+
} // namespace rive
36+
37+
#endif

include/rive/generated/core_registry.hpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
#include "rive/artboard_list_map_rule.hpp"
9494
#include "rive/assets/asset.hpp"
9595
#include "rive/assets/audio_asset.hpp"
96+
#include "rive/assets/blob_asset.hpp"
9697
#include "rive/assets/drawable_asset.hpp"
9798
#include "rive/assets/export_audio.hpp"
9899
#include "rive/assets/file_asset.hpp"
@@ -362,12 +363,18 @@ class CoreRegistry
362363
return new DataEnumSystem();
363364
case ViewModelPropertyViewModelBase::typeKey:
364365
return new ViewModelPropertyViewModel();
365-
case ViewModelInstanceBase::typeKey:
366-
return new ViewModelInstance();
367-
case ViewModelPropertyBooleanBase::typeKey:
368-
return new ViewModelPropertyBoolean();
366+
case DataEnumValueBase::typeKey:
367+
return new DataEnumValue();
368+
case ViewModelPropertyTriggerBase::typeKey:
369+
return new ViewModelPropertyTrigger();
370+
case ViewModelPropertyStringBase::typeKey:
371+
return new ViewModelPropertyString();
369372
case ViewModelPropertyColorBase::typeKey:
370373
return new ViewModelPropertyColor();
374+
case ViewModelPropertyBooleanBase::typeKey:
375+
return new ViewModelPropertyBoolean();
376+
case ViewModelInstanceBase::typeKey:
377+
return new ViewModelInstance();
371378
case ViewModelPropertyAssetImageBase::typeKey:
372379
return new ViewModelPropertyAssetImage();
373380
case ViewModelInstanceBooleanBase::typeKey:
@@ -380,18 +387,12 @@ class CoreRegistry
380387
return new ViewModelInstanceTrigger();
381388
case ViewModelInstanceSymbolListIndexBase::typeKey:
382389
return new ViewModelInstanceSymbolListIndex();
383-
case ViewModelPropertyStringBase::typeKey:
384-
return new ViewModelPropertyString();
385390
case ViewModelInstanceViewModelBase::typeKey:
386391
return new ViewModelInstanceViewModel();
387-
case ViewModelPropertyTriggerBase::typeKey:
388-
return new ViewModelPropertyTrigger();
389392
case ViewModelInstanceAssetBase::typeKey:
390393
return new ViewModelInstanceAsset();
391394
case ViewModelInstanceAssetImageBase::typeKey:
392395
return new ViewModelInstanceAssetImage();
393-
case DataEnumValueBase::typeKey:
394-
return new DataEnumValue();
395396
case CustomPropertyTriggerBase::typeKey:
396397
return new CustomPropertyTrigger();
397398
case ScriptInputTriggerBase::typeKey:
@@ -810,6 +811,8 @@ class CoreRegistry
810811
return new ArtboardListMapRule();
811812
case CustomPropertyEnumBase::typeKey:
812813
return new CustomPropertyEnum();
814+
case BlobAssetBase::typeKey:
815+
return new BlobAsset();
813816
case FolderBase::typeKey:
814817
return new Folder();
815818
case ScriptAssetBase::typeKey:
@@ -1572,15 +1575,15 @@ class CoreRegistry
15721575
case ViewModelInstanceStringBase::propertyValuePropertyKey:
15731576
object->as<ViewModelInstanceStringBase>()->propertyValue(value);
15741577
break;
1575-
case ComponentBase::namePropertyKey:
1576-
object->as<ComponentBase>()->name(value);
1577-
break;
15781578
case DataEnumValueBase::keyPropertyKey:
15791579
object->as<DataEnumValueBase>()->key(value);
15801580
break;
15811581
case DataEnumValueBase::valuePropertyKey:
15821582
object->as<DataEnumValueBase>()->value(value);
15831583
break;
1584+
case ComponentBase::namePropertyKey:
1585+
object->as<ComponentBase>()->name(value);
1586+
break;
15841587
case DataConverterBase::namePropertyKey:
15851588
object->as<DataConverterBase>()->name(value);
15861589
break;
@@ -3021,12 +3024,12 @@ class CoreRegistry
30213024
case ViewModelInstanceStringBase::propertyValuePropertyKey:
30223025
return object->as<ViewModelInstanceStringBase>()
30233026
->propertyValue();
3024-
case ComponentBase::namePropertyKey:
3025-
return object->as<ComponentBase>()->name();
30263027
case DataEnumValueBase::keyPropertyKey:
30273028
return object->as<DataEnumValueBase>()->key();
30283029
case DataEnumValueBase::valuePropertyKey:
30293030
return object->as<DataEnumValueBase>()->value();
3031+
case ComponentBase::namePropertyKey:
3032+
return object->as<ComponentBase>()->name();
30303033
case DataConverterBase::namePropertyKey:
30313034
return object->as<DataConverterBase>()->name();
30323035
case AnimationBase::namePropertyKey:
@@ -3882,9 +3885,9 @@ class CoreRegistry
38823885
case ViewModelComponentBase::namePropertyKey:
38833886
case DataEnumCustomBase::namePropertyKey:
38843887
case ViewModelInstanceStringBase::propertyValuePropertyKey:
3885-
case ComponentBase::namePropertyKey:
38863888
case DataEnumValueBase::keyPropertyKey:
38873889
case DataEnumValueBase::valuePropertyKey:
3890+
case ComponentBase::namePropertyKey:
38883891
case DataConverterBase::namePropertyKey:
38893892
case AnimationBase::namePropertyKey:
38903893
case StateMachineComponentBase::namePropertyKey:
@@ -4656,12 +4659,12 @@ class CoreRegistry
46564659
return object->is<DataEnumCustomBase>();
46574660
case ViewModelInstanceStringBase::propertyValuePropertyKey:
46584661
return object->is<ViewModelInstanceStringBase>();
4659-
case ComponentBase::namePropertyKey:
4660-
return object->is<ComponentBase>();
46614662
case DataEnumValueBase::keyPropertyKey:
46624663
return object->is<DataEnumValueBase>();
46634664
case DataEnumValueBase::valuePropertyKey:
46644665
return object->is<DataEnumValueBase>();
4666+
case ComponentBase::namePropertyKey:
4667+
return object->is<ComponentBase>();
46654668
case DataConverterBase::namePropertyKey:
46664669
return object->is<DataConverterBase>();
46674670
case AnimationBase::namePropertyKey:

include/rive/lua/rive_lua_libs.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "lua.h"
55
#include "lualib.h"
66
#include "rive/animation/linear_animation_instance.hpp"
7+
#include "rive/assets/file_asset.hpp"
78
#include "rive/assets/script_asset.hpp"
89
#include "rive/lua/lua_state.hpp"
910
#include "rive/math/raw_path.hpp"
@@ -214,6 +215,8 @@ enum class LuaAtoms : int16_t
214215
viewModel,
215216
rootViewModel,
216217
image,
218+
blob,
219+
size,
217220

218221
// Animation
219222
duration,
@@ -334,6 +337,16 @@ class ScriptedImage
334337
static constexpr bool hasMetatable = true;
335338
};
336339

340+
class ScriptedBlob
341+
{
342+
public:
343+
rcp<FileAsset> asset; // Holds ref to keep BlobAsset alive
344+
345+
static constexpr uint8_t luaTag = LUA_T_COUNT + 35;
346+
static constexpr const char* luaName = "Blob";
347+
static constexpr bool hasMetatable = true;
348+
};
349+
337350
class ScriptedImageSampler
338351
{
339352
public:

src/assets/blob_asset.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "rive/assets/blob_asset.hpp"
2+
3+
using namespace rive;
4+
5+
bool BlobAsset::decode(SimpleArray<uint8_t>& data, Factory*)
6+
{
7+
m_bytes = std::move(data);
8+
return true;
9+
}
10+
11+
std::string BlobAsset::fileExtension() const { return "blob"; }
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "rive/generated/assets/blob_asset_base.hpp"
2+
#include "rive/assets/blob_asset.hpp"
3+
4+
using namespace rive;
5+
6+
Core* BlobAssetBase::clone() const
7+
{
8+
auto cloned = new BlobAsset();
9+
cloned->copy(*this);
10+
return cloned;
11+
}

src/lua/lua_scripted_context.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
#include "rive/lua/rive_lua_libs.hpp"
33
#include "rive/scripted/scripted_object.hpp"
44
#include "rive/assets/image_asset.hpp"
5+
#include "rive/assets/blob_asset.hpp"
56
#include "rive/file.hpp"
67

78
#include <math.h>
89
#include <stdio.h>
10+
#include <string.h>
911

1012
using namespace rive;
1113

@@ -107,6 +109,43 @@ static int context_namecall(lua_State* L)
107109

108110
return 0; // return nil if not found
109111
}
112+
case (int)LuaAtoms::blob:
113+
{
114+
const char* blobName = luaL_checkstring(L, 2);
115+
116+
auto scriptedObject = scriptedContext->scriptedObject();
117+
auto scriptAsset = scriptedObject->scriptAsset();
118+
if (scriptAsset != nullptr)
119+
{
120+
File* file = scriptAsset->file();
121+
if (file != nullptr)
122+
{
123+
auto assets = file->assets();
124+
for (const auto& asset : assets)
125+
{
126+
if (asset->is<BlobAsset>())
127+
{
128+
BlobAsset* blobAsset = asset->as<BlobAsset>();
129+
if (blobAsset->name() == blobName)
130+
{
131+
auto bytes = blobAsset->bytes();
132+
if (!bytes.empty())
133+
{
134+
auto scriptedBlob =
135+
lua_newrive<ScriptedBlob>(L);
136+
scriptedBlob->asset = ref_rcp(
137+
static_cast<FileAsset*>(blobAsset));
138+
return 1;
139+
}
140+
}
141+
}
142+
}
143+
}
144+
}
145+
146+
return 0; // return nil if not found
147+
}
148+
110149
default:
111150
break;
112151
}

src/lua/renderer/lua_blob.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#ifdef WITH_RIVE_SCRIPTING
2+
#include "lua.h"
3+
#include "lualib.h"
4+
#include "rive/lua/rive_lua_libs.hpp"
5+
#include "rive/assets/blob_asset.hpp"
6+
7+
#include <string.h>
8+
9+
using namespace rive;
10+
11+
static int blob_index(lua_State* L)
12+
{
13+
auto blob = lua_torive<ScriptedBlob>(L, 1);
14+
15+
int atom;
16+
const char* name = lua_tostringatom(L, 2, &atom);
17+
if (!name)
18+
{
19+
luaL_typeerrorL(L, 2, lua_typename(L, LUA_TSTRING));
20+
}
21+
22+
BlobAsset* blobAsset = blob->asset ? blob->asset->as<BlobAsset>() : nullptr;
23+
if (blobAsset == nullptr)
24+
{
25+
lua_pushnil(L);
26+
return 1;
27+
}
28+
29+
switch (atom)
30+
{
31+
case (int)LuaAtoms::size:
32+
lua_pushnumber(L, static_cast<double>(blobAsset->bytes().size()));
33+
return 1;
34+
case (int)LuaAtoms::name:
35+
lua_pushstring(L, blobAsset->name().c_str());
36+
return 1;
37+
case (int)LuaAtoms::data:
38+
{
39+
auto bytes = blobAsset->bytes();
40+
if (bytes.size() > 0)
41+
{
42+
void* bufferData = lua_newbuffer(L, bytes.size());
43+
memcpy(bufferData, bytes.data(), bytes.size());
44+
return 1;
45+
}
46+
lua_pushnil(L);
47+
return 1;
48+
}
49+
}
50+
51+
luaL_error(L,
52+
"'%s' is not a valid index of %s",
53+
name,
54+
ScriptedBlob::luaName);
55+
return 0;
56+
}
57+
58+
int luaopen_rive_blob(lua_State* L)
59+
{
60+
lua_register_rive<ScriptedBlob>(L);
61+
62+
lua_pushcfunction(L, blob_index, nullptr);
63+
lua_setfield(L, -2, "__index");
64+
lua_setreadonly(L, -1, true);
65+
lua_pop(L, 1);
66+
67+
return 0;
68+
}
69+
70+
#endif

src/lua/renderer/lua_renderer_library.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ int luaopen_rive_path(lua_State* L);
55
int luaopen_rive_gradient(lua_State* L);
66
int luaopen_rive_mesh(lua_State* L);
77
int luaopen_rive_image(lua_State* L);
8+
int luaopen_rive_blob(lua_State* L);
89
int luaopen_rive_paint(lua_State* L);
910
int luaopen_rive_renderer(lua_State* L);
1011

1112
static const lua_CFunction rendererTypes[] = {luaopen_rive_path,
1213
luaopen_rive_gradient,
1314
luaopen_rive_mesh,
1415
luaopen_rive_image,
16+
luaopen_rive_blob,
1517
luaopen_rive_paint,
1618
luaopen_rive_renderer};
1719

0 commit comments

Comments
 (0)