Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Impossible to inject variable in canvas child component #732

Open
5 tasks done
emavitta opened this issue Jun 10, 2024 · 6 comments · May be fixed by #806
Open
5 tasks done

Impossible to inject variable in canvas child component #732

emavitta opened this issue Jun 10, 2024 · 6 comments · May be fixed by #806
Labels
feature p3-significant High-priority enhancement (priority)

Comments

@emavitta
Copy link

Describe the bug

I'm trying to inject a variable inside a component in a TresCanvas, but it's always undefined.

In the example i log the variable provided by the first component but in the SecondTresjs component, the variable is undefined

Am i doing something wrong? I cannot find anything in the docs about the context.

Reproduction

https://stackblitz.com/edit/vitejs-vite-gtrfxh?file=src%2Fcomponents%2FFirstTresjs.vue

Steps to reproduce

No response

System Info

No response

Used Package Manager

npm

Code of Conduct

@JakobHock
Copy link

I think the problem lies with the custom Tresjs renderer. I think it loses the previous context from the default renderer.

The first time you inject it's actually outside the TresJS renderer thus still having access to the same context and there for the provided value.
The second time you inject the context has changed and the dependency injection does not have any value registered for the key test.

Notice if you inject a value in SecondTresjs.vue and add a child like ThirdTresjs.vue the provided value is correctly injected like in this Example.

Take the explanation with a grain of salt as i'm not 100% sure about the specfics.

@andretchen0
Copy link
Contributor

andretchen0 commented Jun 10, 2024

Fwiw, if anyone would like to look into this, here's a slightly more minimal reproduction with some notes and a minimal on-screen test:

https://stackblitz.com/edit/vitejs-vite-5q8vs7?file=src%2FApp.vue

@emavitta
Copy link
Author

I think the problem lies with the custom Tresjs renderer. I think it loses the previous context from the default renderer.

The first time you inject it's actually outside the TresJS renderer thus still having access to the same context and there for the provided value. The second time you inject the context has changed and the dependency injection does not have any value registered for the key test.

Notice if you inject a value in SecondTresjs.vue and add a child like ThirdTresjs.vue the provided value is correctly injected like in this Example.

Take the explanation with a grain of salt as i'm not 100% sure about the specfics.

thanks for the solution and the explanation, even though i cannot understand why you cannot have more than one context

@emavitta
Copy link
Author

think the problem is in this function

const createInternalComponent = (context: TresContext) =>
  defineComponent({
    setup() {
      const ctx = getCurrentInstance()?.appContext;
      if (ctx) {
        ctx.app = instance as App;
      }
      provide("useTres", context);
      provide("extend", extend);
      if (typeof window !== "undefined") {
        registerTresDevtools(ctx?.app, context);
      }
      return () => h(Fragment, null, slots?.default ? slots.default() : []);
    },
  });

It could be possible to add an additional params (context: TresContext,additionalContext) to the function called inside mountCustomRenderer that pass custom provided variables.
It can be an array given to a new props on the canvas (additional-context=['key-one','key-two']) ; this way inside mountCustomRender we can inject these variables, pass them to createInternalComponent() and from here provided again white the same name.

@alvarosabu alvarosabu added question Further information is requested pending-triage Ticket is pending to be prioritised waiting for author labels Jun 15, 2024
@EvanSchleret
Copy link

Hi,

Does anyone have a final answer on how to deal with injected values in a Tree Scene ?

Of course I can pass my variable through props but it can be really annoying.

Thanks :)

@alvarosabu
Copy link
Member

Does anyone have a final answer on how to deal with injected values in a Tree Scene ?

Hi @EvanSchleret we are currently discussing it internally, I personally see value in it. Let's see if it is feasible.

@alvarosabu alvarosabu added feature p3-significant High-priority enhancement (priority) and removed question Further information is requested pending-triage Ticket is pending to be prioritised labels Aug 27, 2024
@alvarosabu alvarosabu linked a pull request Aug 27, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature p3-significant High-priority enhancement (priority)
Projects
Status: Todo
Development

Successfully merging a pull request may close this issue.

5 participants