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); }
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); }