protected Quaternion GetViewDirectionForInterestPoint(InterestPoint p, CompositionSettings composition)
    {
        Vector3 cameraPosition = CameraPosition;
        Vector3 target         = p.transform.position;

        Vector3    dir    = (target - cameraPosition).normalized;
        Quaternion lookAt = Quaternion.LookRotation(dir, Vector3.up);

        float   farClip      = 1500f;
        Vector2 screenTarget = composition.screenTarget * 2f - Vector2.one;

        float     distance     = Mathf.Clamp01(Vector3.Distance(cameraPosition, target) / farClip);
        Matrix4x4 invViewProj  = GetViewProjection(cameraPosition, lookAt).inverse;
        Vector4   targetNdcPos = new Vector4(screenTarget.x, screenTarget.y, -distance, 1f) * farClip;

        Vector4 vsPos = invViewProj * targetNdcPos;

        vsPos /= vsPos.w;

        Vector3 newTargetPosition = new Vector3(vsPos.x, vsPos.y, vsPos.z);
        Vector3 newDir            = (newTargetPosition - cameraPosition).normalized;

        lookAt = Quaternion.LookRotation(-newDir, Vector3.up);

        return(lookAt);
    }
    protected virtual CompositionSettings ProposeComposition()
    {
        CompositionSettings c = new CompositionSettings();

        // Random rule of thirds. TODO: based on item's biggest axis, align on X or Y
        int column = Mathf.RoundToInt(ProceduralEngine.RandomRange(1f, 3f));

        c.screenTarget = new Vector2(column * .25f + ProceduralEngine.RandomRange(-.05f, .05f), ProceduralEngine.RandomRange(.4f, .6f)); // TODO: use frustum main axis
        c.deadZoneSize = 0.01f;
        c.fieldOfView  = ProceduralEngine.RandomRange(25f, 50f);                                                                         // TODO: Find a fov that adjusts to the interest point's size
        return(c);
    }
Exemplo n.º 3
0
        public static IServiceProvider Initialize(
            IServiceCollection services,
            CompositionSettings compositionSettings,
            ILogger <CompositionRoot> logger)
        {
            if (compositionSettings == null)
            {
                throw new ArgumentNullException(nameof(compositionSettings));
            }

            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            // NOTE: register exported types
            services.RegisterExportedTypes(compositionSettings, logger);

            // NOTE: other services
            // ...
            // services.AddScoped<IUserClaimsPrincipalFactory<AppUser>, AppUserClaimsPrincipalFactory>();

            return(services.BuildServiceProvider());
        }
        public static IServiceCollection RegisterExportedTypes(
            this IServiceCollection services,
            CompositionSettings compositionSettings,
            ILogger <CompositionRoot> logger)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            if (compositionSettings == null)
            {
                throw new ArgumentNullException(nameof(compositionSettings));
            }

            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            var diStartDateTime = DateTime.Now;

            var targetTypes     = GetIocCoreProviderRegisteredTypes(compositionSettings.SkipTypeIfFqnContainsAnyOf).ToList();
            var targetTypeNames = string.Join(Environment.NewLine, targetTypes.Select(x => x.FullName));

            logger.LogInformation(
                "Found ({count}) attribute registered types for IoC DI: {types}",
                targetTypes.Count,
                Environment.NewLine + targetTypeNames);

            // WARNING: parallel processing causes issues
            foreach (var registerType in targetTypes)
            {
                var dependencyAttr = registerType.GetCustomAttribute <RegisterDependencyAttribute>();
                var contractType   = dependencyAttr.ContractType ?? registerType.GetInterface($"I{registerType.Name}");

                if (contractType == null)
                {
                    throw new InvalidOperationException(
                              $"No IoC container registration contract type could be resolved for the concrete type '{registerType.FullName}'.");
                }

                switch (dependencyAttr.InjectionStyle)
                {
                case ServiceInjectionStyle.Instant:
                    RegisterInstantService(services, registerType, contractType, dependencyAttr, logger);
                    break;

                case ServiceInjectionStyle.Func:
                    RegisterFuncService(services, registerType, contractType, dependencyAttr, logger);
                    break;

                case ServiceInjectionStyle.Lazy:
                    RegisterLazyService(services, registerType, contractType, dependencyAttr, logger);
                    break;

                case ServiceInjectionStyle.All:
                    RegisterInstantService(services, registerType, contractType, dependencyAttr, logger);
                    RegisterFuncService(services, registerType, contractType, dependencyAttr, logger);
                    RegisterLazyService(services, registerType, contractType, dependencyAttr, logger);
                    break;

                default:
                    throw new InvalidOperationException("Unsupported IoC container service injection style.");
                }
            }

            logger.LogInformation("Dependency injection finished in: '{elapsed}'", DateTime.Now - diStartDateTime);
            return(services);
        }