public void Render(Personaje personaje, SuvirvalCraft contexto) { d3dDevice.Transform.View = Matrix.LookAtLH(personaje.PosicionAlturaCabeza(), personaje.DireccionAlturaCabeza(150), new Vector3(0, 1, 0)); //Actualizar volumen del Frustum con nuevos valores de camara frustum.updateVolume(d3dDevice.Transform.View, d3dDevice.Transform.Projection); //El personaje no debe animarse cuando se esta en primera persona personaje.RenderizarPrimeraPersona(contexto); }
public void Render(Personaje personaje, SuvirvalCraft contexto) { //Hacer que la camara siga al personaje en su nueva posicion. Sumamos 100 en el posición de Y porque queremos que la cámara este un poco más alta. camaraTgc.Target = personaje.mesh.Position + new Vector3(0, 100, 0); //Actualizamos la rotacion si es que hubo camaraTgc.RotationY = personaje.mesh.Rotation.Y; //Porque el personaje esta rotado 180 grados respecto de la camara. camaraTgc.rotateY(Geometry.DegreeToRadian(180f)); //Actualizar volumen del Frustum con nuevos valores de camara frustum.updateVolume(d3dDevice.Transform.View, d3dDevice.Transform.Projection); personaje.RenderizarTerceraPersona(contexto); }
/// <summary> /// Renderizar escenario BSP utilizando matriz PVS para descartar clusters no visibles /// </summary> /// <param name="camPos">Posición actual de la camara</param> public void render(Vector3 camPos) { Device device = GuiController.Instance.D3dDevice; float elapsedTime = GuiController.Instance.ElapsedTime; time += elapsedTime; //Obtener leaf actual int actualLeaf = FindLeaf(camPos); //Obtener clusters visibles segun PVS int actualCluster = data.leafs[actualLeaf].cluster; if (actualCluster != antCluster) { antCluster = actualCluster; clusterVis.Clear(); for (int i = 0; i < data.leafs.Length; i++) { if (isClusterVisible(actualCluster, data.leafs[i].cluster)) { clusterVis.Add(i); } } } //Actualizar volumen del Frustum con nuevos valores de camara TgcFrustum frustum = GuiController.Instance.Frustum; frustum.updateVolume(device.Transform.View, device.Transform.Projection); foreach (int nleaf in clusterVis) { //Frustum Culling con el AABB del cluster TgcCollisionUtils.FrustumResult result = TgcCollisionUtils.classifyFrustumAABB(frustum, data.leafs[nleaf].boundingBox); if (result == TgcCollisionUtils.FrustumResult.OUTSIDE) { continue; } //Habilitar meshes de este leaf QLeaf currentLeaf = data.leafs[nleaf]; for (int i = currentLeaf.firstLeafSurface; i < currentLeaf.firstLeafSurface + currentLeaf.numLeafSurfaces; i++) { int iMesh = data.leafSurfaces[i]; TgcMesh mesh = meshes[iMesh]; if (mesh != null) { meshes[iMesh].Enabled = true; } } } //Renderizar meshes visibles mViewProj = device.Transform.View * device.Transform.Projection; for (int i = 0; i < meshes.Count; i++) { //Ignonar si no está habilitada TgcMesh mesh = meshes[i]; if (mesh == null || !mesh.Enabled) { continue; } QShaderData shader = data.shaderXSurface[i]; //Renderizado con shaders //TODO: Mejorar el renderizado de shaders. Por ahora esta deshabilitado if (shader != null && shader.Stages.Count > 0) { renderShaderMesh(mesh, shader); } //Renderizado normal else { //render mesh.render(); //deshabilitar para la proxima vuelta mesh.Enabled = false; } } }
/// <summary> /// Hacer render del ejemplo /// </summary> internal void render() { Device d3dDevice = tgcD3dDevice.D3dDevice; elapsedTime = HighResolutionTimer.Instance.FrameTime; tgcD3dDevice.doClear(); //Acutalizar input tgcD3dInput.update(); //Actualizar camaras (solo una va a estar activada a la vez) if (currentCamera.Enable) { this.currentCamera.updateCamera(); this.currentCamera.updateViewMatrix(d3dDevice); } //actualizar posicion de pantalla en barra de estado de UI setStatusPosition(); //actualizar el Frustum frustum.updateVolume(d3dDevice.Transform.View, d3dDevice.Transform.Projection); //limpiar texturas texturesManager.clearAll(); //actualizar Listener3D directSound.updateListener3d(); //Hacer render delegando control total al ejemplo if (customRenderEnabled) { //Ejecutar render del ejemplo if (currentExample != null) { currentExample.render(elapsedTime); } } //Hacer render asistido (mas sencillo para el ejemplo) else { //Iniciar escena 3D d3dDevice.BeginScene(); //Actualizar contador de FPS si esta activo if (fpsCounterEnable) { text3d.drawText("FPS: " + HighResolutionTimer.Instance.FramesPerSecond, 0, 0, Color.Yellow); } //Ejecutar render del ejemplo if (currentExample != null) { currentExample.render(elapsedTime); } //Ejes cartesianos if (axisLines.Enable) { axisLines.render(); } //Finalizar escena 3D d3dDevice.EndScene(); } d3dDevice.Present(); //this.Invalidate(); }
/// <summary> /// Renderizar escenario BSP utilizando matriz PVS para descartar clusters no visibles /// </summary> /// <param name="camPos">Posición actual de la camara</param> public void render(TGCVector3 camPos, TgcFrustum frustum, float elapsedTime) { time += elapsedTime; //Obtener leaf actual var actualLeaf = FindLeaf(camPos); //Obtener clusters visibles segun PVS var actualCluster = Data.leafs[actualLeaf].cluster; if (actualCluster != antCluster) { antCluster = actualCluster; clusterVis.Clear(); for (var i = 0; i < Data.leafs.Length; i++) { if (isClusterVisible(actualCluster, Data.leafs[i].cluster)) { clusterVis.Add(i); } } } //Actualizar volumen del Frustum con nuevos valores de camara; //TODO: esto creo que ya lo hace solo el example en el preupdate. frustum.updateVolume(TGCMatrix.FromMatrix(D3DDevice.Instance.Device.Transform.View), TGCMatrix.FromMatrix(D3DDevice.Instance.Device.Transform.Projection)); foreach (var nleaf in clusterVis) { //Frustum Culling con el AABB del cluster var result = TgcCollisionUtils.classifyFrustumAABB(frustum, Data.leafs[nleaf].boundingBox); if (result == TgcCollisionUtils.FrustumResult.OUTSIDE) { continue; } //Habilitar meshes de este leaf var currentLeaf = Data.leafs[nleaf]; for (var i = currentLeaf.firstLeafSurface; i < currentLeaf.firstLeafSurface + currentLeaf.numLeafSurfaces; i++) { var iMesh = Data.leafSurfaces[i]; var mesh = Meshes[iMesh]; if (mesh != null) { Meshes[iMesh].Enabled = true; } } } //TODO: No deberia manipular Matrix de DX. //Renderizar meshes visibles mViewProj = TGCMatrix.FromMatrix(D3DDevice.Instance.Device.Transform.View * D3DDevice.Instance.Device.Transform.Projection); for (var i = 0; i < Meshes.Count; i++) { //Ignonar si no está habilitada var mesh = Meshes[i]; if (mesh == null || !mesh.Enabled) { continue; } var shader = Data.shaderXSurface[i]; //Renderizado con shaders //TODO: Mejorar el renderizado de shaders. Por ahora esta deshabilitado if (shader != null && shader.Stages.Count > 0) { renderShaderMesh(mesh, shader); } //Renderizado normal else { //render mesh.Render(); //deshabilitar para la proxima vuelta mesh.Enabled = false; } } }