/// <summary> /// Creates a view that covers the screen and emit the surfaces. /// </summary> public void EmitFullScreen() { if(_surfaces[0].VertexCount == 0) { return; } View viewDef = new View(); // for gui editor if((idE.RenderSystem.ViewDefinition == null) || (idE.RenderSystem.ViewDefinition.IsEditor == false)) { viewDef.RenderView.X = 0; viewDef.RenderView.Y = 0; viewDef.RenderView.Width = idE.VirtualScreenWidth; viewDef.RenderView.Height = idE.VirtualScreenHeight; viewDef.ViewPort = idE.RenderSystem.RenderViewToViewPort(viewDef.RenderView); viewDef.Scissor.X1 = 0; viewDef.Scissor.Y1 = 0; viewDef.Scissor.X2 = (short) (viewDef.ViewPort.X2 - viewDef.ViewPort.X1); viewDef.Scissor.Y2 = (short) (viewDef.ViewPort.Y2 - viewDef.ViewPort.Y1); } else { viewDef.RenderView.X = idE.RenderSystem.ViewDefinition.RenderView.X; viewDef.RenderView.Y = idE.RenderSystem.ViewDefinition.RenderView.Y; viewDef.RenderView.Width = idE.RenderSystem.ViewDefinition.RenderView.Width; viewDef.RenderView.Height = idE.RenderSystem.ViewDefinition.RenderView.Height; viewDef.ViewPort.X1 = (short) viewDef.RenderView.X; viewDef.ViewPort.X2 = (short) (viewDef.RenderView.X + idE.RenderSystem.ViewDefinition.RenderView.Width); viewDef.ViewPort.Y1 = (short) viewDef.RenderView.Y; viewDef.ViewPort.Y2 = (short) (viewDef.RenderView.Y += idE.RenderSystem.ViewDefinition.RenderView.Height); viewDef.Scissor.X1 = idE.RenderSystem.ViewDefinition.Scissor.X1; viewDef.Scissor.Y1 = idE.RenderSystem.ViewDefinition.Scissor.Y1; viewDef.Scissor.X2 = idE.RenderSystem.ViewDefinition.Scissor.X2; viewDef.Scissor.Y2 = idE.RenderSystem.ViewDefinition.Scissor.Y2; } Vector2 center = new Vector2(idE.VirtualScreenWidth * 0.5f, idE.VirtualScreenHeight * 0.5f); viewDef.FloatTime = idE.RenderSystem.FrameShaderTime; viewDef.ProjectionMatrix = Matrix.CreateOrthographic(idE.VirtualScreenWidth, idE.VirtualScreenHeight, -0.5f, 1); viewDef.WorldSpace.ModelViewMatrix = Matrix.CreateLookAt(new Vector3(center, 0), new Vector3(center, 1), new Vector3(0, -1, 0)); View oldView = idE.RenderSystem.ViewDefinition; idE.RenderSystem.ViewDefinition = viewDef; // add the surfaces to this view int count = _surfaces.Count; for(int i = 0; i < count; i++) { EmitSurface(_surfaces[i], viewDef.WorldSpace.ModelMatrix, viewDef.WorldSpace.ModelViewMatrix, false); } idE.RenderSystem.ViewDefinition = oldView; // add the command to draw this view idE.RenderSystem.AddDrawViewCommand(viewDef); }
/// <summary> /// Creates a static model based on the definition and view currently. /// </summary> /// <remarks> /// This will be regenerated for every view, even though /// some models, like character meshes, could be used for multiple (mirror) /// views in a frame, or may stay static for multiple frames (corpses) /// The renderer will delete the returned dynamic model the next view. /// </remarks> /// <param name="renderEntity"></param> /// <param name="view"></param> /// <param name="cachedModel"></param> /// <returns></returns> public abstract idRenderModel InstantiateDynamicModel(idRenderEntity renderEntity, View view, idRenderModel cachedModel);
public void EvaluateRegisters(ref float[] registers, float[] shaderParms, View view, idSoundEmitter soundEmitter) { // copy the material constants. for(int i = PredefinedRegisterCount; i < _registerCount; i++) { registers[i] = _expressionRegisters[i]; } // copy the local and global parameters. registers[(int) ExpressionRegister.Time] = view.FloatTime; registers[(int) ExpressionRegister.Parm0] = shaderParms[0]; registers[(int) ExpressionRegister.Parm1] = shaderParms[1]; registers[(int) ExpressionRegister.Parm2] = shaderParms[2]; registers[(int) ExpressionRegister.Parm3] = shaderParms[3]; registers[(int) ExpressionRegister.Parm4] = shaderParms[4]; registers[(int) ExpressionRegister.Parm5] = shaderParms[5]; registers[(int) ExpressionRegister.Parm6] = shaderParms[6]; registers[(int) ExpressionRegister.Parm7] = shaderParms[7]; registers[(int) ExpressionRegister.Parm8] = shaderParms[8]; registers[(int) ExpressionRegister.Parm9] = shaderParms[9]; registers[(int) ExpressionRegister.Parm10] = shaderParms[10]; registers[(int) ExpressionRegister.Parm11] = shaderParms[11]; if(view.RenderView.MaterialParameters != null) { registers[(int) ExpressionRegister.Global0] = view.RenderView.MaterialParameters[0]; registers[(int) ExpressionRegister.Global1] = view.RenderView.MaterialParameters[1]; registers[(int) ExpressionRegister.Global2] = view.RenderView.MaterialParameters[2]; registers[(int) ExpressionRegister.Global3] = view.RenderView.MaterialParameters[3]; registers[(int) ExpressionRegister.Global4] = view.RenderView.MaterialParameters[4]; registers[(int) ExpressionRegister.Global5] = view.RenderView.MaterialParameters[5]; registers[(int) ExpressionRegister.Global6] = view.RenderView.MaterialParameters[6]; registers[(int) ExpressionRegister.Global7] = view.RenderView.MaterialParameters[7]; } ExpressionOperation op; int b; int opCount = (_ops != null) ? _ops.Length : 0; for(int i = 0; i < opCount; i++) { op = _ops[i]; switch(op.OperationType) { case ExpressionOperationType.Add: registers[op.C] = registers[op.A] + registers[op.B]; break; case ExpressionOperationType.Subtract: registers[op.C] = registers[op.A] - registers[op.B]; break; case ExpressionOperationType.Multiply: registers[op.C] = registers[op.A] * registers[op.B]; break; case ExpressionOperationType.Divide: registers[op.C] = registers[op.A] / registers[op.B]; break; case ExpressionOperationType.Modulo: b = (int) registers[op.B]; b = (b != 0) ? b : 1; registers[op.C] = (int) registers[op.A] % b; break; case ExpressionOperationType.Table: idDeclTable table = (idDeclTable) idE.DeclManager.DeclByIndex(DeclType.Table, op.A); registers[op.C] = table.Lookup(registers[op.B]); break; case ExpressionOperationType.Sound: idConsole.Warning("TODO: eoptype sound"); // TODO: OP_TYPE_SOUND: /*if ( soundEmitter ) { registers[op->c] = soundEmitter->CurrentAmplitude(); } else {*/ registers[op.C] = 0; //} break; case ExpressionOperationType.GreaterThan: registers[op.C] = ((registers[op.A] > registers[op.B]) == true) ? 1 : 0; break; case ExpressionOperationType.GreaterThanOrEquals: registers[op.C] = ((registers[op.A] >= registers[op.B]) == true) ? 1 : 0; break; case ExpressionOperationType.LessThan: registers[op.C] = ((registers[op.A] < registers[op.B]) == true) ? 1 : 0; break; case ExpressionOperationType.LessThanOrEquals: registers[op.C] = ((registers[op.A] <= registers[op.B]) == true) ? 1 : 0; break; case ExpressionOperationType.Equals: registers[op.C] = ((registers[op.A] == registers[op.B]) == true) ? 1 : 0; break; case ExpressionOperationType.NotEquals: registers[op.C] = ((registers[op.A] != registers[op.B]) == true) ? 1 : 0; break; case ExpressionOperationType.And: registers[op.C] = (((registers[op.A] != 0) && (registers[op.B] != 0)) == true) ? 1 : 0; break; case ExpressionOperationType.Or: registers[op.C] = (((registers[op.A] != 0) || (registers[op.B] != 0)) == true) ? 1 : 0; break; } } }
public override idRenderModel InstantiateDynamicModel(idRenderEntity renderEntity, View view, idRenderModel cachedModel) { if(cachedModel != null) { cachedModel.Dispose(); } idConsole.Error("InstantiateDynamicModel called on static model '{0}'", this.Name); return null; }
/// <summary> /// As of 5/2/03, about half of the unique materials loaded on typical /// maps are constant, but 2/3 of the surface references are. /// This is probably an optimization of dubious value. /// </summary> private void CheckForConstantRegisters() { if(_parsingData.RegistersAreConstant == false) { return; } // evaluate the registers once and save them. _constantRegisters = new float[_registerCount]; float[] materialParms = new float[idE.MaxEntityMaterialParameters]; View viewDef = new View(); viewDef.RenderView.MaterialParameters = new float[idE.MaxGlobalMaterialParameters]; EvaluateRegisters(ref _constantRegisters, materialParms, viewDef, null); }
public void EvaluateRegisters(ref float[] registers, float[] shaderParms, View view) { EvaluateRegisters(ref registers, shaderParms, view, null); }
/// <summary> /// Rendering a scene may actually render multiple subviews for mirrors and portals, and /// may render composite textures for gui console screens and light projections. /// It would also be acceptable to render a scene multiple times, for "rear view mirrors", etc. /// </summary> /// <param name="renderView"></param> public void RenderScene(idRenderView renderView) { #if ID_DEDICATED #else if(idE.RenderSystem.IsRunning == false) { return; } // skip front end rendering work, which will result // in only gui drawing if(idE.CvarSystem.GetBool("r_skipFrontEnd") == true) { return; } if((renderView.FovX <= 0) || (renderView.FovY <= 0)) { idConsole.Error("idRenderWorld::RenderScene: bad FOVS: {0}, {1}", renderView.FovX, renderView.FovY); } idRenderView copy = renderView.Copy(); // close any gui drawing idE.RenderSystem.GuiModel.EmitFullScreen(); idE.RenderSystem.GuiModel.Clear(); int startTime = idE.System.Milliseconds; // setup view parms for the initial view // View parms = new View(); parms.RenderView = copy; // TODO: screenshot /*if ( tr.takingScreenshot ) { parms->renderView.forceUpdate = true; }*/ // set up viewport, adjusted for resolution and OpenGL style 0 at the bottom parms.ViewPort = idE.RenderSystem.RenderViewToViewPort(parms.RenderView); // the scissor bounds may be shrunk in subviews even if // the viewport stays the same // this scissor range is local inside the viewport parms.Scissor.X1 = 0; parms.Scissor.Y1 = 0; parms.Scissor.X2 = (short) (parms.ViewPort.X2 - parms.ViewPort.X1); parms.Scissor.Y2 = (short) (parms.ViewPort.Y2 - parms.ViewPort.Y1); parms.IsSubview = false; parms.InitialViewAreaOrigin = renderView.ViewOrigin; parms.FloatTime = parms.RenderView.Time * 0.001f; parms.RenderWorld = this; // use this time for any subsequent 2D rendering, so damage blobs/etc // can use level time idE.RenderSystem.FrameShaderTime = parms.FloatTime; // see if the view needs to reverse the culling sense in mirrors // or environment cube sides Vector3 tmp = new Vector3(parms.RenderView.ViewAxis.M21, parms.RenderView.ViewAxis.M22, parms.RenderView.ViewAxis.M23); Vector3 tmp2 = new Vector3(parms.RenderView.ViewAxis.M31, parms.RenderView.ViewAxis.M32, parms.RenderView.ViewAxis.M33); Vector3 tmp3 = new Vector3(parms.RenderView.ViewAxis.M11, parms.RenderView.ViewAxis.M12, parms.RenderView.ViewAxis.M13); Vector3 cross = Vector3.Cross(tmp, tmp2); if((cross * tmp3).Length() > 0) { parms.IsMirror = false; } else { parms.IsMirror = true; } if(idE.CvarSystem.GetBool("r_lockSurfaces") == true) { idConsole.Warning("TODO: R_LockSurfaceScene( parms );"); return; } // save this world for use by some console commands idE.RenderSystem.PrimaryRenderWorld = this; idE.RenderSystem.PrimaryRenderView = copy; idE.RenderSystem.PrimaryView = parms; // rendering this view may cause other views to be rendered // for mirrors / portals / shadows / environment maps // this will also cause any necessary entities and lights to be // updated to the demo file idE.RenderSystem.RenderView(parms); // now write delete commands for any modified-but-not-visible entities, and // add the renderView command to the demo // TODO: demo /*if ( session->writeDemo ) { WriteRenderView( renderView ); }*/ int endTime = idE.System.Milliseconds; // TODO: tr.pc.frontEndMsec += endTime - startTime; // prepare for any 2D drawing after this idE.RenderSystem.GuiModel.Clear(); #endif }
public override idRenderModel InstantiateDynamicModel(idTech4.Renderer.idRenderEntity renderEntity, View view, idRenderModel cachedModel) { if(this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } idConsole.Warning("TODO: idRenderModel_PRT.InstantiateDynamicModel"); return null; }
/// <summary> /// -1 to 1 range in x, y, and z. /// </summary> /// <param name="global"></param> /// <param name="ndc"></param> public static void GlobalToNormalizedDeviceCoordinates(Vector3 global, out Vector3 ndc) { Plane view, clip; // _D3XP added work on primaryView when no viewDef if (idE.RenderSystem.ViewDefinition == null) { View primaryView = idE.RenderSystem.PrimaryView; view.Normal.X = global.X * primaryView.WorldSpace.ModelViewMatrix.M11 + global.Y * primaryView.WorldSpace.ModelViewMatrix.M12 + global.Z * primaryView.WorldSpace.ModelViewMatrix.M13 + primaryView.WorldSpace.ModelViewMatrix.M14; view.Normal.Y = global.X * primaryView.WorldSpace.ModelViewMatrix.M21 + global.Y * primaryView.WorldSpace.ModelViewMatrix.M22 + global.Z * primaryView.WorldSpace.ModelViewMatrix.M23 + primaryView.WorldSpace.ModelViewMatrix.M24; view.Normal.Z = global.X * primaryView.WorldSpace.ModelViewMatrix.M31 + global.Y * primaryView.WorldSpace.ModelViewMatrix.M32 + global.Z * primaryView.WorldSpace.ModelViewMatrix.M33 + primaryView.WorldSpace.ModelViewMatrix.M34; view.D = global.X * primaryView.WorldSpace.ModelViewMatrix.M41 + global.Y * primaryView.WorldSpace.ModelViewMatrix.M42 + global.Z * primaryView.WorldSpace.ModelViewMatrix.M43 + primaryView.WorldSpace.ModelViewMatrix.M44; clip.Normal.X = view.Normal.X * primaryView.WorldSpace.ModelViewMatrix.M11 + view.Normal.Y * primaryView.WorldSpace.ModelViewMatrix.M12 + view.Normal.Z * primaryView.WorldSpace.ModelViewMatrix.M13 + primaryView.WorldSpace.ModelViewMatrix.M14; clip.Normal.Y = view.Normal.X * primaryView.WorldSpace.ModelViewMatrix.M21 + view.Normal.Y * primaryView.WorldSpace.ModelViewMatrix.M22 + view.Normal.Z * primaryView.WorldSpace.ModelViewMatrix.M23 + view.D * primaryView.WorldSpace.ModelViewMatrix.M24; clip.Normal.Z = view.Normal.X * primaryView.WorldSpace.ModelViewMatrix.M31 + view.Normal.Y * primaryView.WorldSpace.ModelViewMatrix.M32 + view.Normal.Z * primaryView.WorldSpace.ModelViewMatrix.M33 + view.D * primaryView.WorldSpace.ModelViewMatrix.M34; clip.D = view.Normal.X * primaryView.WorldSpace.ModelViewMatrix.M41 + view.Normal.Y * primaryView.WorldSpace.ModelViewMatrix.M42 + view.Normal.Z * primaryView.WorldSpace.ModelViewMatrix.M43 + view.D * primaryView.WorldSpace.ModelViewMatrix.M44; } else { View viewDef = idE.RenderSystem.ViewDefinition; view.Normal.X = global.X * viewDef.WorldSpace.ModelViewMatrix.M11 + global.Y * viewDef.WorldSpace.ModelViewMatrix.M12 + global.Z * viewDef.WorldSpace.ModelViewMatrix.M13 + viewDef.WorldSpace.ModelViewMatrix.M14; view.Normal.Y = global.X * viewDef.WorldSpace.ModelViewMatrix.M21 + global.Y * viewDef.WorldSpace.ModelViewMatrix.M22 + global.Z * viewDef.WorldSpace.ModelViewMatrix.M23 + viewDef.WorldSpace.ModelViewMatrix.M24; view.Normal.Z = global.X * viewDef.WorldSpace.ModelViewMatrix.M31 + global.Y * viewDef.WorldSpace.ModelViewMatrix.M32 + global.Z * viewDef.WorldSpace.ModelViewMatrix.M33 + viewDef.WorldSpace.ModelViewMatrix.M34; view.D = global.X * viewDef.WorldSpace.ModelViewMatrix.M41 + global.Y * viewDef.WorldSpace.ModelViewMatrix.M42 + global.Z * viewDef.WorldSpace.ModelViewMatrix.M43 + viewDef.WorldSpace.ModelViewMatrix.M44; clip.Normal.X = view.Normal.X * viewDef.WorldSpace.ModelViewMatrix.M11 + view.Normal.Y * viewDef.WorldSpace.ModelViewMatrix.M12 + view.Normal.Z * viewDef.WorldSpace.ModelViewMatrix.M13 + view.D * viewDef.WorldSpace.ModelViewMatrix.M14; clip.Normal.Y = view.Normal.X * viewDef.WorldSpace.ModelViewMatrix.M21 + view.Normal.Y * viewDef.WorldSpace.ModelViewMatrix.M22 + view.Normal.Z * viewDef.WorldSpace.ModelViewMatrix.M23 + view.D * viewDef.WorldSpace.ModelViewMatrix.M24; clip.Normal.Z = view.Normal.X * viewDef.WorldSpace.ModelViewMatrix.M31 + view.Normal.Y * viewDef.WorldSpace.ModelViewMatrix.M32 + view.Normal.Z * viewDef.WorldSpace.ModelViewMatrix.M33 + view.D * viewDef.WorldSpace.ModelViewMatrix.M34; clip.D = view.Normal.X * viewDef.WorldSpace.ModelViewMatrix.M41 + view.Normal.Y * viewDef.WorldSpace.ModelViewMatrix.M42 + view.Normal.Z * viewDef.WorldSpace.ModelViewMatrix.M43 + view.D * viewDef.WorldSpace.ModelViewMatrix.M44; } ndc.X = clip.Normal.X / clip.D; ndc.Y = clip.Normal.Y / clip.D; ndc.Z = (clip.Normal.Z + clip.D) / (2 * clip.D); }
/// <summary> /// A view may be either the actual camera view, /// a mirror / remote location, or a 3D view on a gui surface. /// </summary> /// <param name="parms"></param> public void RenderView(View parms) { if((parms.RenderView.Width <= 0) || (parms.RenderView.Height <= 0)) { return; } // save view in case we are a subview View oldView = _viewDefinition; _viewCount++; _viewDefinition = parms; _sortOffset = 0; // set the matrix for world space to eye space SetViewMatrix(_viewDefinition); // the four sides of the view frustum are needed // for culling and portal visibility SetupViewFrustum(); // we need to set the projection matrix before doing // portal-to-screen scissor box calculations SetupProjection(); // identify all the visible portalAreas, and the entityDefs and // lightDefs that are in them and pass culling. parms.RenderWorld.FindViewLightsAndEntities(); // constrain the view frustum to the view lights and entities ConstrainViewFrustum(); // make sure that interactions exist for all light / entity combinations // that are visible // add any pre-generated light shadows, and calculate the light shader values // TODO: R_AddLightSurfaces(); // adds ambient surfaces and create any necessary interaction surfaces to add to the light // lists AddModelSurfaces(); // any viewLight that didn't have visible surfaces can have it's shadows removed // TODO: R_RemoveUnecessaryViewLights(); // sort all the ambient surfaces for translucency ordering // TODO: R_SortDrawSurfs(); // generate any subviews (mirrors, cameras, etc) before adding this view // TODO: R_GenerateSubViews /*if(R_GenerateSubViews()) { // if we are debugging subviews, allow the skipping of the // main view draw if(idE.CvarSystem.GetBool("r_subviewOnly") == true) { return; } }*/ // write everything needed to the demo file // TODO: demo /*if ( session->writeDemo ) { static_cast<idRenderWorldLocal *>(parms->renderWorld)->WriteVisibleDefs( tr.viewDef ); }*/ // add the rendering commands for this viewDef AddDrawViewCommand(parms); // restore view in case we are a subview _viewDefinition = oldView; }
/// <summary> /// This is the main 3D rendering command. A single scene may /// have multiple views if a mirror, portal, or dynamic texture is present. /// </summary> /// <param name="view"></param> public void AddDrawViewCommand(View view) { DrawViewRenderCommand cmd = new DrawViewRenderCommand(); cmd.View = view; _frameData.Commands.Enqueue(cmd); // TODO: lock surfaces /*if ( parms->viewEntitys ) { // save the command for r_lockSurfaces debugging tr.lockSurfacesCmd = *cmd; }*/ // TODO: tr.pc.c_numViews++; // TODO: R_ViewStatistics(parms); }
private void SetViewMatrix(View view) { float[] viewerMatrix = new float[16]; ViewEntity world = new ViewEntity(); // transform by the camera placement Vector3 origin = view.RenderView.ViewOrigin; /*viewerMatrix[0] = _viewDefinition.RenderView.ViewAxis.M11; viewerMatrix[4] = _viewDefinition.RenderView.ViewAxis.M12; viewerMatrix[8] = _viewDefinition.RenderView.ViewAxis.M13; viewerMatrix[12] = -origin.X * viewerMatrix[0] + -origin.Y * viewerMatrix[4] + -origin.Z * viewerMatrix[8]; viewerMatrix[1] = _viewDefinition.RenderView.ViewAxis.M21; viewerMatrix[5] = _viewDefinition.RenderView.ViewAxis.M22; viewerMatrix[9] = _viewDefinition.RenderView.ViewAxis.M23; viewerMatrix[13] = -origin.X * viewerMatrix[1] + -origin.Y * viewerMatrix[5] + -origin.Z * viewerMatrix[9]; viewerMatrix[2] = _viewDefinition.RenderView.ViewAxis.M31; viewerMatrix[6] = _viewDefinition.RenderView.ViewAxis.M32; viewerMatrix[10] = _viewDefinition.RenderView.ViewAxis.M33; viewerMatrix[14] = -origin.X * viewerMatrix[2] + -origin.Y * viewerMatrix[6] + -origin.Z * viewerMatrix[10]; viewerMatrix[3] = 0; viewerMatrix[7] = 0; viewerMatrix[11] = 0; viewerMatrix[15] = 1;*/ Vector3 look = origin + Vector3.Transform(Vector3.Forward, _viewDefinition.RenderView.ViewAxis); world.ModelViewMatrix = Matrix.CreateLookAt(origin, look, Vector3.Up); //world.ModelViewMatrix = Matrix.Multiply(world.ModelViewMatrix, FlipMatrix); view.WorldSpace = world; // convert from our coordinate system (looking down X) // to OpenGL's coordinate system (looking down -Z) //idHelper.ConvertMatrix(viewerMatrix, FlipMatrix, out view.WorldSpace.ModelViewMatrix); }
private void Clear() { _frameCount = 0; _viewCount = 0; _staticAllocCount = 0; _frameShaderTime = 0; _viewPortOffset = Vector2.Zero; _tiledViewPort = Vector2.Zero; _ambientLightVector = Vector4.Zero; _sortOffset = 0; _worlds.Clear(); _primaryRenderWorld = null; _primaryView = null; _primaryRenderView = new idRenderView(); _defaultMaterial = null; /* testImage = NULL; ambientCubeImage = NULL;*/ _viewDefinition = null; /*memset( &pc, 0, sizeof( pc ) ); memset( &lockSurfacesCmd, 0, sizeof( lockSurfacesCmd ) );*/ _identitySpace = new ViewEntity(); /*logFile = NULL;*/ _renderCrops = new idRectangle[idE.MaxRenderCrops]; _currentRenderCrop = 0; _guiRecursionLevel = 0; _guiModel = null; /*demoGuiModel = NULL; memset( gammaTable, 0, sizeof( gammaTable ) ); takingScreenshot = false;*/ }