Skip to content

Remove trait implementations on foreign types #94

@teoxoy

Description

@teoxoy

Currently encase has trait implementations on foreign types, there are 2 main issues with this approach:

  • users of encase and X math crate must make sure to use a version of encase that depends on the same version of X math crate they list in their Cargo.toml (related: Update README.md #89)
  • version bumps of math crates cause encase version bumps; this will be reversed if math crates instead host the trait implementations but so far encase's major version bumps have rarely been caused by braking changes in encase's API (this happened only in v0.2 & v0.3)

To make the transition as smooth as possible:

I have done an analysis of crates that depend on encase and features they use and found out that only glam and nalgebra features are used.

Crate list and encase features they use
crate name encase feature
bevy_color  
bevy_egui  
bevy_render glam
bottomless-pit  
dexterior-visuals nalgebra
easy-wgpu nalgebra
fragmentcolor  
glamour  
gloss-renderer nalgebra
include-wgsl-oil  
inox2d-wgpu glam
sdf2mesh  
shute  
spright glam
wgcore nalgebra
wgparry2d nalgebra
wgparry3d nalgebra
wgrapier2d nalgebra
wgrapier3d nalgebra
wgsl-inline  
xc3_wgpu glam

based on https://crates.io/crates/encase/reverse_dependencies as of 2025-04-25

Since published crates might not be representative of all encase users, I've also done an analysis of github repositories with Cargo.tomls listing encase and X features:

Github repositories and encase features they use
encase feature (and github search link) number of entries notes entries
mint 1   https://github.com/rntrtul/moviola/blob/9a31f4e6bd0bf0736d8395a71d06d93fcbe176d5/Cargo.toml#L24
cgmath 12   https://github.com/wdylanbibb/wgpu_voxel_game/blob/c5bc76b052e7b1a218f5cffaf0c85a09c5b0fb2d/Cargo.toml#L26
      https://github.com/HolgerGottChristensen/carbide/blob/96efdfee612decf2cffa3ff7ecd0a2da2f75757b/backends/carbide_wgpu_3d/Cargo.toml#L18
      https://github.com/sparshg/renderer/blob/fe40eb1742bbd6e4e8bc0816492aad510a809889/Cargo.toml#L15
      https://github.com/HomelikeBrick42/2D-RayTracing/blob/b34764c57725998321f10de55d2fa46ff534f716/Cargo.toml#L18
      https://github.com/HomelikeBrick42/Rendering4D/blob/d6bb4bb1f544f268cf9f2ed6fcafc6944bca020a/Cargo.toml#L14
      https://github.com/KaarelKurik/wormhole/blob/d5e7cef39f8354d7562296c18446c8ccd8796b73/Cargo.toml#L18
      https://github.com/HomelikeBrick42/Multiplayer/blob/2dad30c0eb86e3d78c9f7baee6e27ed050a7491d/Cargo.toml#L14
      https://github.com/HomelikeBrick42/TicTacToe/blob/77f6b4e62893743fc258968abec7c2aa8a9a7b2d/Cargo.toml#L10
      https://github.com/HomelikeBrick42/SpaceGame/blob/127170c477fec50114f29951de2f0629f1ef0781/Cargo.toml#L9
      https://github.com/HomelikeBrick42/4D-Blocks/blob/1c40f198f294e935cc6e36f0778eba3054ec8f77/Cargo.toml#L9
      https://github.com/HomelikeBrick42/Physics2/blob/1bfd27b4fa4b869b0a41f001323aff598d9c5472/Cargo.toml#L10
      https://github.com/HomelikeBrick42/ComputeShaderRayTracing/blob/dba8292d414f3d8a727beb3ae498f7fb34990d56/Cargo.toml#L13
glam 72   https://github.com/Nazariglez/rkit/blob/cd88def16b6f5212ab0b5a456086603d6077cfaf/Cargo.toml
      https://github.com/ryanwebber/raybaby/blob/51c1a1f410b28663f86a2be7066ce57d92007e06/Cargo.toml
      https://github.com/ScanMountGoat/ssbh_wgpu/blob/9d6a6a35898e5c1c91b1aa3593bdf3efdffdea81/ssbh_wgpu/Cargo.toml
      https://github.com/ornfelt/my_rust/blob/796a3bb527ea763e6a8d696f175401e7c1bf40b2/repos/learn/bevyengine_bevy/crates/bevy_render/Cargo.toml
      https://github.com/OptimisticPeach/rend3_repro/blob/95608ce2274e84315329a7bfed9fc2543cbe3487/Cargo.toml
      https://github.com/vinhowe/piston/blob/db808db692f77097b75dabffe56f2a27a050c96b/crates/ratchet-core/Cargo.toml
      https://github.com/enpandi/gfx-final-project/blob/7ddedf436786785df11ba08846a0bec9a8b4534e/Cargo.toml
      https://github.com/alanpoon/bevy_wasmcloud_patches/blob/5f9f4a10e5bb465e8ac36077d35f2ea4abd4bcea/crates/bevy_render/Cargo.toml
      https://github.com/BVE-Reborn/rend3/blob/d088a841b0469d07d5a7ff3f4d784e97b4a194d5/rend3-routine/Cargo.toml
      https://github.com/jeff-silva/howto/blob/c87f7fd052820a0d26807a1d3df7776ef2fdb40e/bevy/bevy/crates/bevy_render/Cargo.toml
      https://github.com/stofffe/gbase/blob/95514f57238330f064a55e21fd6e6facbe124020/examples/grass/Cargo.toml
      https://github.com/clstatham/kyrene/blob/13788a04fe68dea848653483b78bece6e87ac1b4/crates/kyrene-graphics/Cargo.toml
      https://github.com/abdo643-HULK/Bachelor-Thesis/blob/fff7358c501ea25d461ce693f53abb6046c0c3be/source-code/crates/render/Cargo.toml
      https://github.com/Azorlogh/sonaphoria/blob/12c78a06d65c5a3543f1f9c290a4cb6a321bd731/Cargo.toml
      https://github.com/RaoulLuque/WGPU-Error-Message-Bug-Showcase/blob/82e598b41948a03db477a1c94423ef82bb423a51/examples/Cargo.toml
      https://github.com/huggingface/ratchet/blob/136da4d5216910bfd015b27a17b837c21f17163a/crates/ratchet-core/Cargo.toml
      https://github.com/lwz23/scan_overunsafe/blob/c45bab49a40102ae44f31d4579db92a954fad4a2/overunsafe%E5%BA%93/%E5%BD%93%E5%89%8D%E6%B5%81%E8%A1%8C%E7%9A%84rust%E5%BA%93/bevy-main/bevy-main/crates/bevy_render/Cargo.toml
      https://github.com/gfx-rs/wgpu/blob/b93b55920a978ef9f013efe8d75cb10e69488629/examples/features/Cargo.toml
      https://github.com/BVE-Reborn/rend3/blob/d088a841b0469d07d5a7ff3f4d784e97b4a194d5/rend3-types/Cargo.toml
      https://github.com/Andrewp2/wgpu_morton_code_radix_sort_test/blob/1e0e8bf3f7b45e9d672a934203ede1ae8e14f6ad/Cargo.toml
      https://github.com/RocketPrinter/fractal-studio/blob/bf6a43e91a9dcca198ede7f19ff788b5cbf84a55/Cargo.toml
      https://github.com/jimblandy/hikari/blob/0ba8bd178c3d6af85a9c8f7c4124234836668293/Cargo.toml
      https://github.com/ScanMountGoat/wgsl_to_wgpu/blob/0d57458a6e51964d1071cb22f90148523dc84aa2/example/Cargo.toml
      https://github.com/FL33TW00D/wgpu-bench/blob/db76a8dc5508ba183f36df9f6b2551712d582355/Cargo.toml
      https://github.com/cg-tuwien/Math2Model/blob/33e4125595dc243c624a194eba4fd44080df0ec4/parametric-renderer-core/Cargo.toml
      https://github.com/bayou-brogrammer/bevy_shader_playground/blob/5ee58d72eafaf22798eb74a0c348fd4f6b65953a/sims/game_of_life_sim/Cargo.toml
      https://github.com/Itsnotdone/zepl/blob/52a287be71f7f3dc87cb4a22eff0de83cb481f88/crates/scene/Cargo.toml
      https://github.com/quilde/dust_renderer/blob/923160ec6619af3c678d734eb7003daf4eb3b9a3/Cargo.toml
      https://github.com/ryanwebber/mandelscope/blob/3d46e99629599538d7695a17e696b0c52577c442/Cargo.toml
      https://github.com/Tsuguri/octo/blob/f18ea1d3bfe015e3aa3c3ac8474ce15a831fc942/just_renderer/Cargo.toml
      https://github.com/stofffe/gbase/blob/95514f57238330f064a55e21fd6e6facbe124020/Cargo.toml
      https://github.com/BLaZeKiLL/webray/blob/c9eba39e7cf5d93df59b28702aecfe2f1c8e497c/webray/Cargo.toml
      https://github.com/Norlock/sparticles/blob/e0e53fe0aa569b0fd0d0c6e79a42cf37365f8715/crates/sparticles_app/Cargo.toml
      https://github.com/goodhoko/sonic-anemometer/blob/a172147721fd11ca5678df6fbb6ffe1ec065dfeb/crates/computer/Cargo.toml
      https://github.com/bevyengine/bevy/blob/12f71a8936c77735b6f702b1ef849dfc8a306a37/crates/bevy_render/Cargo.toml
      https://github.com/huseyinnates/Rust/blob/a6e757c55982fec1e9ddeb1b8f600c66220fec28/bevy/crates/bevy_render/Cargo.toml
      https://github.com/stofffe/gbase/blob/95514f57238330f064a55e21fd6e6facbe124020/utils/gbase_utils/Cargo.toml
      https://github.com/obiwac/wgpu/blob/ad2ec6d7324bf349dd736348b28ebd17394e8411/examples/Cargo.toml
      https://github.com/GetAGripGal/VoxelRendererSchoolProject/blob/f623180d3353738f91309d1cb1eaeef9954fcda9/Cargo.toml
      https://github.com/MrSteppy/paper_mario_origami_king_ai/blob/f9eb45f50c1762cd10a802055e9b2503d51c76d6/gui/Cargo.toml
      https://github.com/uzuna/rs-common/blob/deed534de58e65911c9fa87ce0b905f29d943b87/crates/wgpu-shader/Cargo.toml
      https://github.com/riwanou/wgpu_lua_fun/blob/0cd71787300a83d5cea0467493b4d45f201444c9/Cargo.toml
      https://github.com/skyne98/wgpu-playground/blob/dccedea8d8893aa0a512c4c99ffaf36759cec3bb/Cargo.toml
      https://github.com/uzuna/rs-common/blob/deed534de58e65911c9fa87ce0b905f29d943b87/examples/wgpu-generate/Cargo.toml
      https://github.com/LeshaInc/ohm/blob/cca10f2405d52d8e51da9d3634679bf55052ba23/Cargo.toml
      https://github.com/ryanwebber/blossim/blob/12bfe1a8a66509a2734b8a9f80505145ef20ea9b/Cargo.toml
      https://github.com/alanjian85/prisma/blob/dda7b2722bdfcb307adc8fde84dadc40ea9c549d/Cargo.toml
      https://github.com/cbbowen/stark/blob/2cda52c9b799c12e7938c0917af55c2e0d23da70/Cargo.toml
      https://github.com/ezrasingh/wgpu-sandbox/blob/e9357ab9c1dd30a923fee3bebf40706ca93cf3cf/Cargo.toml
      https://github.com/sebbeutler/wv/blob/e7b8e0adc9f12459c5e6469d0e1fa39e44cad63b/waveboard-wasm/Cargo.toml
      https://github.com/YishiMichael/wgpu-quadratic-bezier-3d/blob/a21faf45f194cf5f22d11500f30d831a2ebd89fb/Cargo.toml
      https://github.com/jim-works/bevy_render/blob/d7bfcc531df62305f77cfc73eb8e3dd32b5c65cc/Cargo.toml
      https://github.com/pcolusso/sim-test/blob/e2e436ead675ffd6b940fe7ab51809e22a229a70/Cargo.toml
      https://github.com/AlpYilmazz/flat/blob/0f8956425539c985cee5b69bb7ebfe87e5c845b8/Cargo.toml
      https://github.com/katharostech/NESImg/blob/91b8b5d5960ec38d008255c83bd3bb93c0849f22/Cargo.toml
      https://github.com/LucentFlux/include-wgsl-oil/blob/b05bce5df690cee21860504392eec92f417368a8/Cargo.toml
      https://github.com/GetAGripGal/MiniVector/blob/5eb373d908d4ca5ece3c1606de622c01aab8d520/Cargo.toml
      https://github.com/MeetKai/bevy/blob/6b2b194cca90f1ed4c977e254a97477382eda0ea/crates/bevy_render/Cargo.toml
      https://github.com/sabithpocker/sabithpocker.github.io/blob/d2242072ecf280f6d62ec286ab1587b2f8812dfc/generative_art/Cargo.toml
      https://github.com/KentaYoshioka/bevy/blob/06a0eac6cc48496b2017425349550317f08e0247/crates/bevy_render/Cargo.toml
      https://github.com/Bromles/wgpu-tutorial/blob/a71366f79c43a33efcb02bb1ef5d6a072bb90a56/Cargo.toml
      https://github.com/m-colson/stitching/blob/fbc39e50eb8b34eddcf94bce53c90f273e077829/stitch/Cargo.toml
      https://github.com/443eb9/aurora/blob/11120879b0aff1e066e2303e35cf29e39265677a/Cargo.toml
      https://github.com/vxpm/shimmer/blob/29a3df51d4cc9d725277aed2c37a2b2fd8a7a332/shimmer_wgpu/Cargo.toml
      https://github.com/abdo643-HULK/Bachelor-Thesis/blob/fff7358c501ea25d461ce693f53abb6046c0c3be/source-code/app/Cargo.toml
      https://github.com/JMS55/nbody/blob/b7a739b8b9575a7a1f9f961114c743ff098c2efc/Cargo.toml
      https://github.com/ScanMountGoat/xc3_lib/blob/beafadd4fa86bf6db56b3bfe28effe0cdae336d6/xc3_wgpu/Cargo.toml
      https://github.com/contagnas/bevyw/blob/ff2a3107243dad3c372294cc1eed6a52ef75d43e/crates/bevy_render/Cargo.toml
      https://github.com/modbrin/schedar/blob/2a4d6f560b602dad648f91b516dc7e3151b5b790/Cargo.toml
      https://github.com/MahouTechnologies/moc3-rs/blob/ade9c16850c472cfe02a8b81b32ae1707e5a5f0d/moc3-wgpu/Cargo.toml
      https://github.com/soundeffects/prockit/blob/6b72278e0c1d8c70455ee170187b6428f640b4d3/crates/rasterless/Cargo.toml
      https://github.com/jonathandw743/black_hole_ray_marching/blob/6e4cf51baa0edd972f10d562a2e2ec6becd8af2d/Cargo.toml
nalgebra 26   https://github.com/dimforge/wgmath/blob/7026d21abf81a82e5288e66f4030ed7207ac36ec/Cargo.toml
      https://github.com/WilstonOreo/sdf2mesh/blob/dcf324c57ea970b95b3b6d06eb368bbf2c6bb04e/Cargo.toml
      https://github.com/LabL4/rsnet/blob/e2573bae23226ace132e500b6c8bd9198f6f6a7a/crates/rsnet_viewer/Cargo.toml
      https://github.com/dimitri-br/mini-renderer/blob/07620a5e0151931dae1302a63278125de8299b2b/Cargo.toml
      https://github.com/Killavus/wgpu-basics/blob/8f73a5586b32e02208c5970ece3adf3735f843d3/Cargo.toml
      https://github.com/Mesoptier/ray-marching/blob/1204116445541a3fe660ba3c3fb0881a801490e2/Cargo.toml
      https://github.com/luiswirth/carveout/blob/73b74f723ebb9d37a9d270c7b9b35b60c209be59/Cargo.toml
      https://github.com/YishiMichael/morphing/blob/6a28b2f5f4afecdc29dbbd9391cb5b92f0e227b3/morphing-builtins/Cargo.toml
      https://github.com/Killavus/wgpu-raytracing-in-one-weekend/blob/8fde363c434d8a38e715de05fdd41a16780da636/Cargo.toml
      https://github.com/connorslade/beam-time/blob/657c3da8e0f7f84c41899d6f3194eb646dfe0c6c/Cargo.toml
      https://github.com/m0lentum/dexterior/blob/44eb5912dac416e6ae5ee3c118a40999c11c980f/crates/dexterior-visuals/Cargo.toml
      https://github.com/DevinLeamy/Eva/blob/45850af6a68907ebbb10f24b79617d0ab5565055/eva/Cargo.toml
      https://github.com/connorslade/mslicer/blob/8d1e70f436c1bf6ee4d3133deea2e900dac1f681/Cargo.toml
      https://github.com/connorslade/wave-sim/blob/0691c2aa2383c8f020ea9ad47200e61c5e247aa7/Cargo.toml
      https://github.com/MatthewMcDade13/raydium-2d/blob/e6dfcedb04126a75e04bf37157e76f6d40c783b7/Cargo.toml
      https://github.com/dimitri-br/wgpuTest/blob/5f193b16ea4e2a358cc3138865cd6ceb9b0e1fd4/Cargo.toml
      https://github.com/m0lentum/art/blob/cb5f72e4c5a547c5c6eeaea333eb66ea1545e771/demodemonini/Cargo.toml
      https://github.com/connorslade/compute/blob/9c271e4a31e5cc36ba00e16afef73eae038bb433/Cargo.toml
      https://github.com/dimforge/wgsparkl/blob/d857579f14ee09b3e80672c8c8727f0c89380e27/Cargo.toml
      https://github.com/Meshcapade/gloss/blob/aa11c2fb42e75a3031d0e2062a5881323603c554/Cargo.toml
      https://github.com/connorslade/ray-tracing/blob/5b50604c880f0dda8721d2b613221b3a0f9670c8/Cargo.toml
      https://github.com/connorslade/compute/blob/9c271e4a31e5cc36ba00e16afef73eae038bb433/examples/dots/Cargo.toml
      https://github.com/dimforge/wgmath/blob/7026d21abf81a82e5288e66f4030ed7207ac36ec/crates/wgebra/Cargo.toml
      https://github.com/connorslade/compute/blob/9c271e4a31e5cc36ba00e16afef73eae038bb433/examples/mandelbrot/Cargo.toml
      https://github.com/connorslade/wave-sim-3d/blob/f06a9f18876e0e10b94989e860cefb535f689013/Cargo.toml
      https://github.com/connorslade/compute/blob/9c271e4a31e5cc36ba00e16afef73eae038bb433/examples/mandelbrot-interactive/Cargo.toml
ultraviolet 1   https://github.com/mbullington/iron-doom/blob/505a1258b51925975d80781110b9429a98af9c6c/id_core/Cargo.toml#L21
vek 0    
smallvec 3   https://github.com/huggingface/ratchet/blob/136da4d5216910bfd015b27a17b837c21f17163a/crates/ratchet-core/Cargo.toml#L32
      https://github.com/vinhowe/piston/blob/db808db692f77097b75dabffe56f2a27a050c96b/crates/ratchet-core/Cargo.toml#L33
    doesn’t seem to use it in the code https://github.com/Nazariglez/rkit/blob/cd88def16b6f5212ab0b5a456086603d6077cfaf/Cargo.toml#L52
arrayvec 1 doesn’t seem to use it in the code https://github.com/Nazariglez/rkit/blob/cd88def16b6f5212ab0b5a456086603d6077cfaf/Cargo.toml#L52
tinyvec 0    
ndarray 1 doesn’t seem to use it in the code https://github.com/wdylanbibb/wgpu_voxel_game/blob/c5bc76b052e7b1a218f5cffaf0c85a09c5b0fb2d/Cargo.toml#L26
rpds 0    
archery 0    
im  ? github search doesn’t seem to be able to search for only 2 characters; I will take a guess based on usage of im-rc and say the number of usages is also 0  
im-rc 0    
imbl 0    
static-rc 0    

Based on these findings:

Once there are ways forward for users, I will release a v0.12 that includes the removal of all optional features and coordinate with the crates above to add the trait implementations behind an encase feature flag.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions