Blend loader: Add texture cache.
This commit is contained in:
parent
67307032da
commit
8155c53314
3 changed files with 10 additions and 2 deletions
|
@ -94,6 +94,7 @@ method close*(self: BlendLoader) =
|
||||||
self.resource = nil
|
self.resource = nil
|
||||||
self.blend_file = nil
|
self.blend_file = nil
|
||||||
self.cached_materials.clear()
|
self.cached_materials.clear()
|
||||||
|
self.textures.clear()
|
||||||
|
|
||||||
method openAssetFile*(self: BlendLoader, path: string) =
|
method openAssetFile*(self: BlendLoader, path: string) =
|
||||||
if self.resource != nil:
|
if self.resource != nil:
|
||||||
|
@ -204,17 +205,21 @@ method loadTextureImpl*(self: BlendLoader, name: string, img: FNode): Texture =
|
||||||
return self.engine.newTexture(name,1,1,1,RGBA_f16,pixels=c16.to float32)
|
return self.engine.newTexture(name,1,1,1,RGBA_f16,pixels=c16.to float32)
|
||||||
# of 5: # UDIM sequence
|
# of 5: # UDIM sequence
|
||||||
else:
|
else:
|
||||||
assert false, "Image source not supported yet: " & $source
|
assert false, &"Image source not supported yet: {source}, image '{name}'"
|
||||||
|
|
||||||
method loadTexture*(self: BlendLoader, name: string): Texture =
|
method loadTexture*(self: BlendLoader, name: string): Texture =
|
||||||
# sources:
|
# sources:
|
||||||
# 1 image
|
# 1 image
|
||||||
# 4 generated
|
# 4 generated
|
||||||
# 5 render
|
# 5 render
|
||||||
|
if name in self.textures:
|
||||||
|
return self.textures[name]
|
||||||
for img in self.blend_file.named_blocks["IM"]:
|
for img in self.blend_file.named_blocks["IM"]:
|
||||||
let nm = img.id.name.str.strip2
|
let nm = img.id.name.str.strip2
|
||||||
if name == nm:
|
if name == nm:
|
||||||
return self.loadTextureImpl(name, img)
|
let tex = self.loadTextureImpl(name, img)
|
||||||
|
self.textures[name] = tex
|
||||||
|
return tex
|
||||||
raise newException(KeyError, "Can't find image " & name)
|
raise newException(KeyError, "Can't find image " & name)
|
||||||
|
|
||||||
proc makeMaterialAndTextures(self: BlendLoader;
|
proc makeMaterialAndTextures(self: BlendLoader;
|
||||||
|
|
|
@ -77,6 +77,8 @@ proc pack_normal(v: Vec3): float32 =
|
||||||
(z)
|
(z)
|
||||||
let f = cast[float32](i)
|
let f = cast[float32](i)
|
||||||
return f - (if f >= 0.0: 1.0 else: -1.0)
|
return f - (if f >= 0.0: 1.0 else: -1.0)
|
||||||
|
|
||||||
|
|
||||||
proc equals[T](a: ArrRef[T], s:seq[T], offset: int): bool =
|
proc equals[T](a: ArrRef[T], s:seq[T], offset: int): bool =
|
||||||
for i, v in a:
|
for i, v in a:
|
||||||
if a[i] != s[offset+i]: return false
|
if a[i] != s[offset+i]: return false
|
||||||
|
|
|
@ -914,6 +914,7 @@ type BlendLoader* = ref object of Loader
|
||||||
cached_materials*: Table[(FNode, string, bool),
|
cached_materials*: Table[(FNode, string, bool),
|
||||||
(string, seq[Varying], OrderedTable[string, string], OrderedTable[string, TexturePixels])] ## private
|
(string, seq[Varying], OrderedTable[string, string], OrderedTable[string, TexturePixels])] ## private
|
||||||
resource*: LoadableResource
|
resource*: LoadableResource
|
||||||
|
textures*: Table[string, Texture]
|
||||||
|
|
||||||
template enqueue*(renderer: RenderManager, fun: untyped) =
|
template enqueue*(renderer: RenderManager, fun: untyped) =
|
||||||
## Run a proc after the renderer has been initialized.
|
## Run a proc after the renderer has been initialized.
|
||||||
|
|
Loading…
Reference in a new issue