Skip to content

Commit

Permalink
Rename load -> hydrate for runtime handling
Browse files Browse the repository at this point in the history
  • Loading branch information
tommy-xr committed Jul 2, 2024
1 parent 979955e commit 36dddc1
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 57 deletions.
16 changes: 10 additions & 6 deletions runtime/functor-runtime-common/src/asset/renderable_asset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ pub trait RenderableAsset {
type HydratedType;
type OptionsType;

fn load(&self, gl_context: &glow::Context, options: &Self::OptionsType) -> Self::HydratedType;
fn hydrate(
&self,
gl_context: &glow::Context,
options: &Self::OptionsType,
) -> Self::HydratedType;
}

enum RenderableAssetState<T: RenderableAsset> {
Expand All @@ -23,22 +27,22 @@ impl<T: RenderableAsset> RuntimeRenderableAsset<T> {
}
}

pub fn ensure_loaded(&self, gl_context: &glow::Context) -> &Self {
pub fn ensure_hydrated(&self, gl_context: &glow::Context) -> &Self {
let mut state = self.state.borrow_mut();
if let Some(asset_state) = state.take() {
let new_state = match asset_state {
RenderableAssetState::Hydrated(_) => asset_state,
RenderableAssetState::Dehydrated(asset, options) => {
println!("Hydrating asset!");
RenderableAssetState::Hydrated(asset.load(gl_context, &options))
RenderableAssetState::Hydrated(asset.hydrate(gl_context, &options))
}
};
*state = Some(new_state);
}
self
}

pub fn get_loaded(&self) -> Option<Ref<T::HydratedType>> {
pub fn get_opt(&self) -> Option<Ref<T::HydratedType>> {
if let Some(RenderableAssetState::Hydrated(ref loaded)) = *self.state.borrow() {
Some(Ref::map(self.state.borrow(), |s| {
if let Some(RenderableAssetState::Hydrated(ref l)) = *s {
Expand All @@ -53,7 +57,7 @@ impl<T: RenderableAsset> RuntimeRenderableAsset<T> {
}

pub fn get(&self, context: &glow::Context) -> Ref<T::HydratedType> {
self.ensure_loaded(context);
self.get_loaded().unwrap()
self.ensure_hydrated(context);
self.get_opt().unwrap()
}
}
55 changes: 55 additions & 0 deletions runtime/functor-runtime-common/src/texture/texture_2d.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,58 @@ impl RuntimeTexture for Texture2D {
}
}
}

impl RenderableAsset for TextureData {
type HydratedType = glow::Texture;
type OptionsType = TextureOptions;

fn hydrate(
&self,
gl_context: &glow::Context,
options: &Self::OptionsType,
) -> Self::HydratedType {
unsafe {
let gl = gl_context;
let texture = gl.create_texture().expect("Texture to be created");
gl.bind_texture(glow::TEXTURE_2D, Some(texture));

// Set texture parameters
let wrap_val = if options.wrap {
glow::REPEAT
} else {
glow::CLAMP_TO_EDGE
};

let filter = if options.linear {
glow::LINEAR
} else {
glow::NEAREST
};

gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, wrap_val as i32);
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, wrap_val as i32);
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, filter as i32);
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, filter as i32);

let format = match self.format {
PixelFormat::RGB => glow::RGB,
PixelFormat::RGBA => glow::RGBA,
};

gl.tex_image_2d(
glow::TEXTURE_2D,
0,
glow::RGBA as i32,
self.width as i32,
self.height as i32,
0,
format,
glow::UNSIGNED_BYTE,
Some(&self.bytes),
);

gl.bind_texture(glow::TEXTURE_2D, None);
texture
}
}
}
51 changes: 0 additions & 51 deletions runtime/functor-runtime-common/src/texture/texture_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,54 +37,3 @@ impl TextureData {
}
}
}

impl RenderableAsset for TextureData {
type HydratedType = glow::Texture;
type OptionsType = TextureOptions;

fn load(&self, gl_context: &glow::Context, options: &Self::OptionsType) -> Self::HydratedType {
unsafe {
let gl = gl_context;
let texture = gl.create_texture().expect("Texture to be created");
gl.bind_texture(glow::TEXTURE_2D, Some(texture));

// Set texture parameters
let wrap_val = if options.wrap {
glow::REPEAT
} else {
glow::CLAMP_TO_EDGE
};

let filter = if options.linear {
glow::LINEAR
} else {
glow::NEAREST
};

gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, wrap_val as i32);
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, wrap_val as i32);
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, filter as i32);
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, filter as i32);

let format = match self.format {
PixelFormat::RGB => glow::RGB,
PixelFormat::RGBA => glow::RGBA,
};

gl.tex_image_2d(
glow::TEXTURE_2D,
0,
glow::RGBA as i32,
self.width as i32,
self.height as i32,
0,
format,
glow::UNSIGNED_BYTE,
Some(&self.bytes),
);

gl.bind_texture(glow::TEXTURE_2D, None);
texture
}
}
}

0 comments on commit 36dddc1

Please sign in to comment.