public override void render() { BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, true); BRenderDevice.getDevice().SetRenderState(RenderStates.SourceBlend, (int)Microsoft.DirectX.Direct3D.Blend.SourceAlpha); BRenderDevice.getDevice().SetRenderState(RenderStates.DestinationBlend, (int)Microsoft.DirectX.Direct3D.Blend.InvSourceAlpha); Texture mask = TerrainGlobals.getTerrainFrontEnd().getSelectedMaskTexture(); SurfaceDescription sd = mask.GetLevelDescription(0); float validRadius = sd.Width / 2; List <BTerrainQuadNode> nodes = new List <BTerrainQuadNode>(); int closestX = 0; int closestZ = 0; { // in this node, find the CLOSEST vertex to this actual position. BTerrainEditor.findClosestVertex(ref closestX, ref closestZ, ref TerrainGlobals.getEditor().mBrushIntersectionPoint, TerrainGlobals.getEditor().mBrushIntersectionNode); TerrainGlobals.getTerrain().getQuadNodeRoot().getTileBoundsIntersection(nodes, (int)(closestX - validRadius), (int)(closestX + validRadius), (int)(closestZ - validRadius), (int)(closestZ + validRadius)); } for (int i = 0; i < nodes.Count; i++) { nodes[i].renderCursor(); } BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, false); }
//CLM Called when a light is moved by the user static public void moveLight(int editorObjectIndex) { int lightIndex = giveLightIndex(editorObjectIndex); if (lightIndex == -1) { return; } //copy our influence list List <worldChunk> wcList = new List <worldChunk>(); copyList(mLights[lightIndex].mWorldChunksImAffecting, wcList); //remove this light from the world grid removeLightFromGrid(mLights[lightIndex]); //add this light to the world grid addLightToGrid(mLights[lightIndex]); //merge the two lists mergeList(mLights[lightIndex].mWorldChunksImAffecting, wcList); //reload affected qns for (int i = 0; i < wcList.Count; i++) { rasterLightsToNode(wcList[i]); } TerrainGlobals.getTerrain().rebuildDirtyPostDeform(BRenderDevice.getDevice()); }
//------------------------------------------ public override void render() { BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, true); BRenderDevice.getDevice().SetRenderState(RenderStates.SourceBlend, (int)Microsoft.DirectX.Direct3D.Blend.SourceAlpha); BRenderDevice.getDevice().SetRenderState(RenderStates.DestinationBlend, (int)Microsoft.DirectX.Direct3D.Blend.InvSourceAlpha); List <BTerrainQuadNode> nodes = new List <BTerrainQuadNode>(); int closestX = 0; int closestZ = 0; { // in this node, find the CLOSEST vertex to this actual position. BTerrainEditor.findClosestVertex(ref closestX, ref closestZ, ref TerrainGlobals.getEditor().mBrushIntersectionPoint, TerrainGlobals.getEditor().mBrushIntersectionNode); TerrainGlobals.getTerrain().getQuadNodeRoot().getTileBoundsIntersection(nodes, (int)(closestX - mDecalRadius), (int)(closestX + mDecalRadius), (int)(closestZ - mDecalRadius), (int)(closestZ + mDecalRadius)); } for (int i = 0; i < nodes.Count; i++) { nodes[i].renderCursor(); } BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, false); }
//light deleted, remove from our manager static public void freeLight(int editorObjectIndex) { int lightIndex = giveLightIndex(editorObjectIndex); if (lightIndex == -1) { return; } List <worldChunk> wcList = new List <worldChunk>(); copyList(mLights[lightIndex].mWorldChunksImAffecting, wcList); //remove this light from the world grid removeLightFromGrid(mLights[lightIndex]); //reload affected qns for (int i = 0; i < wcList.Count; i++) { rasterLightsToNode(wcList[i]); } TerrainGlobals.getTerrain().rebuildDirtyPostDeform(BRenderDevice.getDevice()); //remove this light from the main list mLights.RemoveAt(lightIndex); }
public void renderFull(int w, int h) { Vector4 v = new Vector4(0, 0, (float)w, (float)h); mShader.SetValue(m_fxViewport, v); Vector4 v2 = new Vector4(0, 0, 0, 0); mShader.SetValue(m_fxDestRegionCoord, v2); Vector4 v3 = new Vector4((float)w, (float)h, 0, 0); mShader.SetValue(m_fxDestRegionSize, v3); Vector4 v4 = new Vector4(1.0f / (float)w, 1.0f / (float)h, 0, 0); mShader.SetValue(m_fxInvDestRegionSize, v4); Viewport vp = new Viewport(); vp.X = 0; vp.Y = 0; vp.Width = w; vp.Height = h; vp.MinZ = 0; vp.MaxZ = 1; BRenderDevice.getDevice().Viewport = vp; mShader.CommitChanges(); BRenderDevice.beginScene(); mShader.Begin(FX.DoNotSaveState | FX.DoNotSaveShaderState | FX.DoNotSaveSamplerState); mShader.BeginPass(0); s_Quad.render(); mShader.EndPass(); mShader.End(); BRenderDevice.endScene(); }
public void preConvertSetup() { if (savedRenderTarget != null) { savedRenderTarget.Dispose(); savedRenderTarget = null; } if (savedDepthSurf != null) { savedDepthSurf.Dispose(); savedDepthSurf = null; } BRenderDevice.getDevice().RenderState.CullMode = Cull.None; BRenderDevice.getDevice().RenderState.ZBufferWriteEnable = false; BRenderDevice.getDevice().RenderState.ZBufferEnable = false; BRenderDevice.getDevice().VertexDeclaration = VertexTypes.PosW_uv0_uv1.vertDecl; BRenderDevice.getDevice().RenderState.AlphaBlendEnable = true; BRenderDevice.getDevice().SetRenderState(RenderStates.SourceBlend, (int)Microsoft.DirectX.Direct3D.Blend.SourceAlpha); BRenderDevice.getDevice().SetRenderState(RenderStates.DestinationBlend, (int)Microsoft.DirectX.Direct3D.Blend.InvSourceAlpha); savedViewport = BRenderDevice.getDevice().Viewport; savedRenderTarget = BRenderDevice.getDevice().GetRenderTarget(0); savedDepthSurf = BRenderDevice.getDevice().DepthStencilSurface; BRenderDevice.getDevice().DepthStencilSurface = mDepthStenSurf; BRenderDevice.getDevice().SetStreamSource(0, mCompositeVertexBuffer, 0); BRenderDevice.getDevice().Indices = mCompositeIndexBuffer; }
//CLM these just generate D3D Texture versions of the KNS & Recolor data //we should be able to remove this class all together unsafe void recoloredExemplarToD3DTexture(Exemplar a, int l) { // recolored exemplar // . quantize ! Quantizer q = new Quantizer(a.recoloredStack(l), Globals.QUANTIZE_NUM_BITS, Globals.QUANTIZE_PERCENT_INSIDE); m_d3dRecolored_0_3 = new Texture(BRenderDevice.getDevice(), a.recoloredStack(l).width(), a.recoloredStack(l).height(), 1, 0, Format.A8R8G8B8, Pool.Managed); // . fill GraphicsStream texstream = m_d3dRecolored_0_3.LockRectangle(0, LockFlags.None); byte * data = (byte *)texstream.InternalDataPointer; int rectPitch = a.recoloredStack(l).width() * 4; for (int j = 0; j < a.recoloredStack(l).height(); j++) { for (int i = 0; i < a.recoloredStack(l).width(); i++) { int v0 = q.quantized().get(i, j, 0); int v1 = q.quantized().get(i, j, 1); int v2 = q.quantized().get(i, j, 2); int v3 = q.quantized().get(i, j, 3); Globals.Assert(v0 >= 0 && v0 <= 255); Globals.Assert(v1 >= 0 && v1 <= 255); Globals.Assert(v2 >= 0 && v2 <= 255); Globals.Assert(v3 >= 0 && v3 <= 255); data[i * 4 + j * rectPitch + 2] = (byte)(v0); data[i * 4 + j * rectPitch + 1] = (byte)(v1); data[i * 4 + j * rectPitch + 0] = (byte)(v2); data[i * 4 + j * rectPitch + 3] = (byte)(v3); } } m_d3dRecolored_0_3.UnlockRectangle(0); // de-quantization parameters m_UnqRecolored_Scale = new List <float>(Globals.NUM_RUNTIME_PCA_COMPONENTS); m_UnqRecolored_Mean = new List <float>(Globals.NUM_RUNTIME_PCA_COMPONENTS); for (int c = 0; c < Globals.NUM_RUNTIME_PCA_COMPONENTS; c++) { m_UnqRecolored_Scale.Add(q.radius(c)); m_UnqRecolored_Mean.Add(q.center(c)); } // . unquantize, recolored exemplar qr_mean_0_3 = new Vector4(m_UnqRecolored_Mean[0], m_UnqRecolored_Mean[1], m_UnqRecolored_Mean[2], m_UnqRecolored_Mean[3]); qr_scale_0_3 = new Vector4(m_UnqRecolored_Scale[0], m_UnqRecolored_Scale[1], m_UnqRecolored_Scale[2], m_UnqRecolored_Scale[3]); Vector4 div3 = new Vector4(0.33333f, 0.3333f, 0.3333f, 0.3333f); Vector4 mul2 = new Vector4(2, 2, 2, 2); qr_mean_0_3 = qr_mean_0_3 - qr_scale_0_3; qr_scale_0_3 = Vector4.Multiply(Vector4.Multiply(qr_scale_0_3, 1 / 3.0f), 2); }
//-------------------------------------------------------------------------- void renderInit(uint width, uint height, Surface pRenderTargetSurf, bool furthestDepth, Matrix worldToView, Matrix viewToProj) { BRenderDevice.getDevice().Transform.World = Matrix.Identity; BRenderDevice.getDevice().Transform.View = worldToView; BRenderDevice.getDevice().Transform.Projection = viewToProj; Viewport viewport = new Viewport(); viewport.X = 0; viewport.Y = 0; viewport.Width = (int)width; viewport.Height = (int)height; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; BRenderDevice.getDevice().Viewport = viewport; BRenderDevice.getDevice().DepthStencilSurface = pDepthStencilSurf; BRenderDevice.getDevice().SetRenderTarget(0, pRenderTargetSurf); BRenderDevice.getDevice().Clear(ClearFlags.ZBuffer | ClearFlags.Target, furthestDepth ? (unchecked ((int)(0x00000000))) : (unchecked ((int)(0xFFFFFFFF))), furthestDepth ? 0 : 1, 0); BRenderDevice.getDevice().SetRenderState(RenderStates.CullMode, (int)Cull.None); BRenderDevice.getDevice().SetRenderState(RenderStates.ZEnable, true); BRenderDevice.getDevice().SetRenderState(RenderStates.ZBufferFunction, furthestDepth ? (int)Compare.GreaterEqual : (int)Compare.LessEqual); //BD3D::mpDev->SetRenderState(D3DRS_HALFPIXELOFFSET, TRUE); }
public void create(int width, int height, int numEntries, int rows, int columns, int numMips, Format fmt) { if (numMips == 0) { numMips = 1; } mWidth = width; mHeight = height; mNumMips = numMips; mNumEntries = numEntries; mRows = rows; mColumns = columns; mFmt = fmt; mTotalHeight = mRows * mHeight; mTotalWidth = mColumns * mWidth; mAtlasScale = mWidth / (float)mTotalWidth; mTextures = new Texture[(int)BTerrainTexturing.eTextureChannels.cSplatChannelCount]; for (int i = 0; i < (int)BTerrainTexturing.eTextureChannels.cSplatChannelCount; i++) { //mTextures[i] = new Texture(BRenderDevice.getDevice(), mTotalWidth, mTotalHeight, numMips, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); // mTextures[i] = new Texture(BRenderDevice.getDevice(), mTotalWidth, mTotalHeight, numMips, Usage.RenderTarget, Format.R5G6B5, Pool.Default); mTextures[i] = new Texture(BRenderDevice.getDevice(), mTotalWidth, mTotalHeight, numMips, Usage.RenderTarget, fmt, Pool.Default); } }
public void create(int width, int height, int numMips, BTerrainCompositeAtlasTexture atlas, int index) { mAtlas = atlas; if (numMips == 0) { numMips = 1; } mWidth = width; mHeight = height; mNumMips = numMips; mIndexInCache = index; if (mAtlas == null) { mTextures = new Texture[(int)BTerrainTexturing.eTextureChannels.cSplatChannelCount]; for (int i = 0; i < (int)BTerrainTexturing.eTextureChannels.cSplatChannelCount; i++) { mTextures[i] = new Texture(BRenderDevice.getDevice(), width, height, numMips, Usage.RenderTarget, Format.R5G6B5, Pool.Default); } } else { mAtlas.getOffsetInfo(index, out mAtlasUVOffset, out mXPixelOffset, out mYPixelOffset); } }
void generateIrradiance(ref Matrix worldToCamera, ref Matrix worldToLight) { //CLM this provides accurate depth peeling results (in ISO view...) BRenderDevice.getDevice().Clear(ClearFlags.ZBuffer | ClearFlags.Target, (unchecked ((int)0x00000000)), 0, 0); ///////////////////////////////////////////////////////////////////////////// //[ ] step5 GENERATE THE IRRADIANCE FOR THIS DEPTH LAYER // Read buffer D at the position of parallel projection of the visible point in buffer A //and store the result into Buffer E if this point is in front of (read: depth is less than) //the visible point along the selected global ray direction //CLM // Render fullscreen quad // for each fragment, get the visible point (A) and project it into lightSpace // get the depth (C) at the point that A lands. // if A.depth > C.depth, E=D; mDepthPeelShader.mShader.SetValue(mShaderPrevDepthTexture, mDepthBufferC); mDepthPeelShader.mShader.SetValue(mShaderWorldPosFromCam, mPointBufferA); mDepthPeelShader.mShader.SetValue(mShaderWorldToCamMatrix, worldToCamera); mDepthPeelShader.mShader.SetValue(mShaderWorldToLightMatrix, worldToLight); mDepthPeelShader.mShader.SetValue(mShaderDepthLayerTexture, mCurrentDepthLayerD); mDepthPeelShader.mShader.BeginPass((int)eShaderPassIndex.eShaderPass5_ProjectLayerTest); mFullscreenQuad.render(true); mDepthPeelShader.mShader.EndPass(); copyRT1toColorTexture(mIrradianceE); // copySurface(mTempTargetSurfCOLOR, mBackBuffer);//CLM copy to backBuffer for debugging... }
public void renderSubWindow(int minXChunk, int minZChunk, int maxXChunk, int maxZChunk) { int numXNodes = (int)(TerrainGlobals.getTerrain().getNumXVerts() / BTerrainQuadNode.cMaxWidth); minXChunk = (int)(BMathLib.Clamp(minXChunk, 0, numXNodes - 1)); minZChunk = (int)(BMathLib.Clamp(minZChunk, 0, numXNodes - 1)); maxXChunk = (int)(BMathLib.Clamp(maxXChunk, 0, numXNodes - 1)); maxZChunk = (int)(BMathLib.Clamp(maxZChunk, 0, numXNodes - 1)); //set LOD Level mTerrainGPUShader.mShader.SetValue(mShaderChunkScaleHandle, TerrainGlobals.getTerrain().getTileScale()); BRenderDevice.getDevice().SetStreamSource(0, mVB, 0); mTerrainGPUShader.mShader.BeginPass((int)mPassNum); BTerrainQuadNode[] mNodes = TerrainGlobals.getTerrain().getQuadNodeLeafArray(); for (int i = minXChunk; i < maxXChunk; i++) { for (int j = minZChunk; j < maxZChunk; j++) { int indx = i * numXNodes + j; renderLeafNode(mNodes[indx]); } } mTerrainGPUShader.mShader.EndPass(); }
static public void clearSelectionMask() { if (mCurrSelectionMask.HasData()) { if (CoreGlobals.getEditorMain().mIMaskPickerUI == null) { CoreGlobals.getEditorMain().mIGUI.ShowDialog("MaskLayers"); } CoreGlobals.getEditorMain().mIMaskPickerUI.SetLastMask(mCurrSelectionMask); } mCurrSelectionMask.Clear(); if (TerrainGlobals.getTerrain().getQuadNodeRoot() != null) { List <BTerrainQuadNode> nodes = new List <BTerrainQuadNode>(); TerrainGlobals.getTerrain().getQuadNodeRoot().getTileBoundsIntersection(nodes, mCurrSelectionMaskExtends.minX, mCurrSelectionMaskExtends.maxX, mCurrSelectionMaskExtends.minZ, mCurrSelectionMaskExtends.maxZ); for (int i = 0; i < nodes.Count; i++) { nodes[i].mDirty = true; } TerrainGlobals.getTerrain().rebuildDirtyPostDeform(BRenderDevice.getDevice()); } // Reset extends mCurrSelectionMaskExtends.empty(); }
//------------------------- //------------------------- void initTextures() { Format fmt = Format.R32F; mTempTargetTexFLOAT = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, Usage.RenderTarget, fmt, Pool.Default); mTempTargetSurfFLOAT = mTempTargetTexFLOAT.GetSurfaceLevel(0); mTempResolveTexFLOAT = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, 0, fmt, Pool.SystemMemory); mTempResolveSurfFLOAT = mTempResolveTexFLOAT.GetSurfaceLevel(0); mTempTargetTexCOLOR = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); mTempTargetSurfCOLOR = mTempTargetTexCOLOR.GetSurfaceLevel(0); mTempResolveTexCOLOR = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, 0, Format.A8R8G8B8, Pool.SystemMemory); mTempResolveSurfCOLOR = mTempResolveTexCOLOR.GetSurfaceLevel(0); mPointBufferA = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, Usage.RenderTarget, Format.A32B32G32R32F, Pool.Default); mPointBufferASurf = mPointBufferA.GetSurfaceLevel(0); mDepthBufferC = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, 0, fmt, Pool.Managed); mDepthBufferCSurf = mDepthBufferC.GetSurfaceLevel(0); //this should be a color texture.. mCurrentDepthLayerD = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, 0, Format.A8R8G8B8, Pool.Managed); mCurrentDepthLayerDSurf = mCurrentDepthLayerD.GetSurfaceLevel(0); //this should be a color texture.. mIrradianceE = new Texture(BRenderDevice.getDevice(), (int)mWidth, (int)mHeight, 1, 0, Format.A8R8G8B8, Pool.Managed); mIrradianceESurf = mIrradianceE.GetSurfaceLevel(0); }
void displayFoliageSet(string foliageSetName) { string fullFileName = CoreGlobals.getWorkPaths().mFoliagePath + "\\" + foliageSetName; FoliageSet fs = null; int setIndex = FoliageManager.newSet(fullFileName); fs = FoliageManager.giveSet(setIndex); //load our image for display if (!File.Exists(fullFileName + "_df.ddx")) { MessageBox.Show(fullFileName + "_df.ddx Not found for this foliage set. Please ensure it exists."); return; } Texture tex = TextureLoader.FromFile(BRenderDevice.getDevice(), fullFileName + "_df.tga"); Image img = Image.FromStream(TextureLoader.SaveToStream(ImageFileFormat.Bmp, tex)); tex.Dispose(); tex = null; Bitmap mainImage = new Bitmap(img); //now, split us into X sub images to display. int numsections = fs.mNumBlades; List <Image> images = splitImg(mainImage, numsections, fs);// splitImgHorizontally(mainImage, numsections); for (int i = 0; i < numsections; i++) { flowLayoutPanel1.Controls.Add(new FoliageBladeButton(images[i].Width, images[i].Height, images[i], fullFileName, i, this)); } }
public override void render() { if (mPrimitives == null) { return; } for (int k = 0; k < mPrimitives.Count; k++) { //BRenderDevice.getDevice().VertexShader = null; // BRenderDevice.getDevice().PixelShader = null; BRenderDevice.getDevice().VertexDeclaration = mPrimitives[k].mVDecl; BRenderDevice.getDevice().SetStreamSource(0, mPrimitives[k].mVB, 0, mPrimitives[k].mVertexSize); if (mPrimitives[k].mIB != null) { BRenderDevice.getDevice().Indices = mPrimitives[k].mIB; } // And now render the groups with the right textures and materials. // BRenderDevice.getDevice().SetTexture(0, null); for (int i = 0; i < mPrimitives[k].mGroups.Count; i++) { BRenderDevice.getDevice().DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, mPrimitives[k].mNumVerts, mPrimitives[k].mGroups[i].mStartIndex, mPrimitives[k].mGroups[i].mPrimCount); } } }
//---------------------------- //---------------------------- #region AO Section Export private void exportAOFileList() { String batchExportLog = outputLog; if (batchExportLog == null) { batchExportLog = Path.Combine(CoreGlobals.getWorkPaths().mLogsDirectory, "batchExportLog." + System.DateTime.Now.ToFileTimeUtc() + ".txt"); } mExportLogStream = new StreamWriter(batchExportLog, true); //export settings Export360.ExportSettings settings = null; if (mUseCustomExportSettings == -1 || mUseCustomExportSettings == 0) { settings = null; } else if (mUseCustomExportSettings == 1) { settings = new Export360.ExportSettings(); settings.SettingsQuick(); } else if (mUseCustomExportSettings == 2) { settings = new Export360.ExportSettings(); settings.SettingsFinal(); } bool createOwnDevice = BRenderDevice.getDevice() == null; if (createOwnDevice) { BRenderDevice.createDevice(this, 640, 480, false); } GrannyManager2.init(); for (int fileCount = 0; fileCount < mScenarioFilesToExport.Count; fileCount++)// (string file in ToExportListBox.SelectedItems) { string scenarioName = mScenarioFilesToExport[fileCount].mFilename; string terrainName = mTerrainFilesToExport[mScenarioFilesToExport[fileCount].mTerrainFileIndex].mFilename; bool okExported = TEDIO.TEDtoAOSection(terrainName, scenarioName, outputDir, mAoNumSections, mAoSectionIndex, settings); } if (createOwnDevice) { BRenderDevice.destroyDevice(); } mExportLogStream.Close(); if (mStatusResult == 0) { File.Delete(batchExportLog); } clearList(); }
//----------------------------------------------------------------------------- public void camUpdate() { Matrix View; View = Matrix.LookAtLH(mEye, mLookAt, mUp); BRenderDevice.getDevice().SetTransform(TransformType.View, View); }
public override void render() { BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, true); BRenderDevice.getDevice().SetRenderState(RenderStates.SourceBlend, (int)Blend.SourceAlpha); BRenderDevice.getDevice().SetRenderState(RenderStates.DestinationBlend, (int)Blend.InvSourceAlpha); BRenderDevice.getDevice().SetRenderState(RenderStates.CullMode, (int)Cull.None); int xRad = mWidth >> 1; int zRad = mHeight >> 1; List <BTerrainQuadNode> nodes = new List <BTerrainQuadNode>(); TerrainGlobals.getTerrain().getQuadNodeRoot().getVertBoundsIntersection(nodes, mCenterX - xRad, mCenterX + xRad, mCenterZ - zRad, mCenterZ + zRad); for (int i = 0; i < nodes.Count; i++) { nodes[i].renderWidget(0); } BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, false); BRenderDevice.getDevice().SetRenderState(RenderStates.CullMode, (int)Cull.CounterClockwise); base.render(); }
void generateNextDepthLayer(ref Matrix worldToLight) { //CLM this provides accurate depth peeling results (in ISO view...) BRenderDevice.getDevice().Clear(ClearFlags.ZBuffer | ClearFlags.Target, (unchecked ((int)0x00000000)), 0, 0); ///////////////////////////////////////////////////////////////////////////// //[X] step6 GENERATE THE NEXT DEPTH LAYER // Render the scene geometry // into buffer B/C (for depth) // into buffer D (for color) // using parallel projection by selecting global ray direction, with reversed depth test // If the fragment of the point has larger depth value than buffer C, then it is culled. (this is handled in the shader.) mDepthPeelShader.mShader.SetValue(mShaderWVPHandle, worldToLight); mDepthPeelShader.mShader.SetValue(mShaderPrevDepthTexture, mDepthBufferC); mDepthPeelShader.mShader.BeginPass((int)eShaderPassIndex.eShaderPass6_CompareDepth); BRenderDevice.getDevice().SetRenderState(RenderStates.ZBufferFunction, (int)Compare.Greater); mOC.Issue(IssueFlags.Begin); mScene.renderScene(); mOC.Issue(IssueFlags.End); mDepthPeelShader.mShader.EndPass(); copyRT0toDepthTexture(mDepthBufferC); copyRT1toColorTexture(mCurrentDepthLayerD); //buffer D for color.. }
void clearBuffers() { ///////////////////////////////////////////////////////////////////////////// //[X] step 2 initlize "depth" buffer B and buffer C to max distance BRenderDevice.getDevice().Clear(ClearFlags.Target, (unchecked ((int)0xFFFFFFFF)), 1, 0); copyRT0toDepthTexture(mDepthBufferC, false); }
void renderCell(RealLOSVisualData handle) { BRenderDevice.getDevice().VertexDeclaration = VertexTypes.Pos_Color.vertDecl; BRenderDevice.getDevice().VertexFormat = VertexTypes.Pos_Color.FVF_Flags; BRenderDevice.getDevice().VertexShader = null; BRenderDevice.getDevice().PixelShader = null; BRenderDevice.getDevice().SetTexture(0, null); BRenderDevice.getDevice().SetStreamSource(0, handle.mVB, 0); BRenderDevice.getDevice().Indices = handle.mIB; BRenderDevice.getDevice().RenderState.CullMode = Cull.None; BRenderDevice.getDevice().SetRenderState(RenderStates.ZBufferWriteEnable, false); BRenderDevice.getDevice().SetRenderState(RenderStates.FillMode, (int)FillMode.WireFrame); //BRenderDevice.getDevice().DrawPrimitives(PrimitiveType.TriangleList, 0, handle.mNumPrims); BRenderDevice.getDevice().DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, handle.mNumVerts, 0, handle.mNumPrims); BRenderDevice.getDevice().SetRenderState(RenderStates.FillMode, (int)FillMode.Solid); BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaTestEnable, false); BRenderDevice.getDevice().SetRenderState(RenderStates.SourceBlend, (int)Blend.SourceAlpha); BRenderDevice.getDevice().SetRenderState(RenderStates.DestinationBlend, (int)Blend.InvSourceAlpha); BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, true); //BRenderDevice.getDevice().DrawPrimitives(PrimitiveType.TriangleList, 0, handle.mNumPrims); BRenderDevice.getDevice().DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, handle.mNumVerts, 0, handle.mNumPrims); BRenderDevice.getDevice().SetRenderState(RenderStates.AlphaBlendEnable, false); BRenderDevice.getDevice().SetRenderState(RenderStates.ZBufferWriteEnable, true); BRenderDevice.getDevice().RenderState.CullMode = Cull.CounterClockwise; }
unsafe public void computeD3DPixPackTextures(Synthesiser m_Synthesizer) { int sz = 0; for (int l = 0; l < Globals.cNumLevels /*m_Synthesizer.getAnalyser().nbLevels()*/; l++) { int csz = Synthesiser.bufferSizeFromWindow(bufferrgn(l)); sz = Math.Max(csz, sz); } mD3DPixPackOffsets = new Texture[m_iNbLevels, Globals.cNumCorrectionPasses, 4]; for (int l = 0; l < m_iNbLevels; l++) { Window window = bufferrgn(l); for (int pass = 0; pass < Globals.cNumCorrectionPasses; pass++) { for (int sub = 0; sub < 4; sub++) { // . which quadrant to update ? int ai = (m_Synthesizer.m_SubpassesOrderingTbl[pass % Globals.SYNTH_ORDER_NUM_PASSES][sub][0] + window.left()) & 1; int aj = (m_Synthesizer.m_SubpassesOrderingTbl[pass % Globals.SYNTH_ORDER_NUM_PASSES][sub][1] + window.top()) & 1; Globals.Assert(ai >= 0 && aj >= 0); Vector4 qszs = m_Synthesizer.bufferSize(sz); mD3DPixPackOffsets[l, pass, sub] = new Texture(BRenderDevice.getDevice(), 5, 5, 1, 0, Format.G16R16F, Pool.Managed); GraphicsStream texstream = mD3DPixPackOffsets[l, pass, sub].LockRectangle(0, LockFlags.None); ushort * data = (ushort *)texstream.InternalDataPointer; int rectPitch = 5 * 2; for (int x = 0; x < 5; x++) { for (int y = 0; y < 5; y++) { int ox = x - 2; int oy = y - 2; int fx = (int)Math.Floor((ox + ai) / 2.0f); int fy = (int)Math.Floor((oy + aj) / 2.0f); Vector4 vq = new Vector4( ((float)(fx + (sz >> 1) * ox) + ai * (sz >> 1)) / qszs.X, ((float)(fy + (sz >> 1) * oy) + aj * (sz >> 1)) / qszs.Y, 0, 0); //offs[x + y * 5] = vq; int srcIndex = x * 2 * sizeof(byte) + y * rectPitch; float16 xx = new float16(vq.X); float16 yy = new float16(vq.Y); data[srcIndex] = xx.getInternalDat(); data[srcIndex + 1] = yy.getInternalDat(); } } mD3DPixPackOffsets[l, pass, sub].UnlockRectangle(0); } } } }
bool Load(string texFilename) { string ext = Path.GetExtension(texFilename); string fullFileName = texFilename; Bitmap bitmap = null; if (ext != @".bmp")//for masks { fullFileName = CoreGlobals.getWorkPaths().getWorkingTexName(texFilename); if (File.Exists(fullFileName)) { Texture tex = TextureLoader.FromFile(BRenderDevice.getDevice(), fullFileName); Image img = Image.FromStream(TextureLoader.SaveToStream(ImageFileFormat.Bmp, tex)); bitmap = new Bitmap(img); if (mPalette.mbRestrictTextureSize && (bitmap.Height != 512 || bitmap.Width != 512 || (bitmap.PixelFormat != System.Drawing.Imaging.PixelFormat.Format32bppArgb))) { MessageBox.Show(String.Format("Texture Format must be Format32bppRgb or Format24bppRgb RGB\n {0} is {1} by {2} by {3}", fullFileName, bitmap.Height, bitmap.Width, bitmap.PixelFormat.ToString())); return(false); } else if (bitmap.Height != 512 || bitmap.Width != 512) { this.DisplayStyle = ToolStripItemDisplayStyle.Image; DropDown.Items.Clear(); return(false); } } else { Texture tex = TextureLoader.FromFile(BRenderDevice.getDevice(), EditorCore.CoreGlobals.getWorkPaths().mBlankTextureName); Image img = Image.FromStream(TextureLoader.SaveToStream(ImageFileFormat.Bmp, tex)); bitmap = new Bitmap(img); } } else //OUR BMP MASKS { if (File.Exists(fullFileName)) { bitmap = new Bitmap(fullFileName); } else { Texture tex = TextureLoader.FromFile(BRenderDevice.getDevice(), EditorCore.CoreGlobals.getWorkPaths().mBlankTextureName); Image img = Image.FromStream(TextureLoader.SaveToStream(ImageFileFormat.Bmp, tex)); bitmap = new Bitmap(img); } } Image myThumbnail = bitmap.GetThumbnailImage(mPalette.mButtonSize, mPalette.mButtonSize, mPalette.myCallback, IntPtr.Zero); ImageScaling = ToolStripItemImageScaling.None; Image = myThumbnail; ToolTipText = texFilename; return(true); }
unsafe void copyRT0toDepthTexture(Texture destTex) { BRenderDevice.getDevice().GetRenderTargetData(mTempTargetSurfFLOAT, mTempResolveSurfFLOAT); copyTexturesFLOAT(mTempResolveTexFLOAT, destTex); }
public void reCreate() { mTextures = new Texture[(int)BTerrainTexturing.eTextureChannels.cSplatChannelCount]; for (int i = 0; i < (int)BTerrainTexturing.eTextureChannels.cSplatChannelCount; i++) { mTextures[i] = new Texture(BRenderDevice.getDevice(), mTotalWidth, mTotalHeight, mNumMips, Usage.RenderTarget, mFmt, Pool.Default); } }
public void create(int sz) { m_d3dSurface = null; m_d3dTexture = null; m_iSize = sz; m_d3dTexture = new Texture(BRenderDevice.getDevice(), sz, sz, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); m_d3dSurface = m_d3dTexture.GetSurfaceLevel(0); }
public void clearPaintLayer() { // save render target D3DProtectRenderTarget locktarget = new D3DProtectRenderTarget(true); // set new render target BRenderDevice.getDevice().SetRenderTarget(0, m_d3dPaintLayerSrf); savedDepthSten = BRenderDevice.getDevice().DepthStencilSurface; BRenderDevice.getDevice().DepthStencilSurface = m_DepthStencilSurface; // render BRenderDevice.getDevice().BeginScene(); if (mJMapPattern == eJMapPattern.cPaint) { BRenderDevice.getDevice().Clear(ClearFlags.Target, unchecked ((int)0x0080FF00), 1.0f, 0); } else { BRenderDevice.getDevice().Clear(ClearFlags.Target, unchecked ((int)0x80808080), 1.0f, 0); } BRenderDevice.getDevice().EndScene(); BRenderDevice.getDevice().SetTexture(0, null); // CLM uncomment this for advection //if (mJMapPattern == eJMapPattern.cVfieldPaint) // { //if (m_VectorFieldPyramid == null) //{ // m_VectorFieldPyramid = new D3DGenMipMapPyramid(AppDomain.CurrentDomain.BaseDirectory + "shaders\\vfield.pyramid.fx", m_d3dPaintLayer); //} //if (m_VectorFieldPyramid.compatible(m_d3dPaintLayer)) //{ // m_VectorFieldPyramid.bind(m_d3dPaintLayer); //} //else //{ // m_VectorFieldPyramid.destroy(); // m_VectorFieldPyramid = null; // m_VectorFieldPyramid = new D3DGenMipMapPyramid(AppDomain.CurrentDomain.BaseDirectory + "shaders\\vfield.pyramid.fx", m_d3dPaintLayer); //} //} if (mJMapPattern == eJMapPattern.cPaint) { m_bNeedUpdateJacobianMap = true; } BRenderDevice.getDevice().DepthStencilSurface = savedDepthSten; savedDepthSten.Dispose(); savedDepthSten = null; // restore render target locktarget.destroy(); locktarget = null; }
unsafe public void clearJacobianMap() { if (m_fxJacobian == null)// || mSynthesiser == null) { return; } Vector4 tr = new Vector4(0, 0, (float)m_iBuffersWidth, (float)m_iBuffersHeight); // save render target D3DProtectRenderTarget locktarget = new D3DProtectRenderTarget(true); // set new render target BRenderDevice.getDevice().SetRenderTarget(0, mJacobianMapSrf); BRenderDevice.getDevice().SetRenderTarget(1, mJacobianMapInverseSrf); savedDepthSten = BRenderDevice.getDevice().DepthStencilSurface; BRenderDevice.getDevice().DepthStencilSurface = m_DepthStencilSurface; // render BRenderDevice.getDevice().BeginScene(); { BRenderDevice.getDevice().Clear(ClearFlags.Target, Color.Black, 1, 0); m_fxJacobian.Technique = m_fxJacobianClearTech; m_fxJacobian.SetValue(m_fxJacobianGlobalScale, mExemplar == null?0:mExemplar.mSynthParams.TextureScale); m_fxJacobian.SetValue(m_fxJacobianSelectedJMap, (int)mJMapPattern); m_fxJacobian.SetValue(m_fxJacobianViewport, tr); m_fxJacobian.CommitChanges(); m_fxJacobian.Begin(FX.DoNotSaveState | FX.DoNotSaveShaderState | FX.DoNotSaveSamplerState); m_fxJacobian.BeginPass(0); m_QuadDual.render(); m_fxJacobian.EndPass(); m_fxJacobian.End(); BRenderDevice.getDevice().EndScene(); } m_bNeedUpdate = true; BRenderDevice.getDevice().DepthStencilSurface = savedDepthSten; savedDepthSten.Dispose(); savedDepthSten = null; BRenderDevice.getDevice().SetRenderTarget(1, null); BRenderDevice.getDevice().SetTexture(0, null); locktarget.destroy(); locktarget = null; // BRenderDevice.writeTextureToFile(mJacobianMap, AppDomain.CurrentDomain.BaseDirectory + "screens\\localFrames.bmp"); // BRenderDevice.writeTextureToFile(mJacobianMapInverse, AppDomain.CurrentDomain.BaseDirectory + "screens\\localFramesINV.bmp"); }
//----------------------- void copyTempD3DValues() { mViewport = BRenderDevice.getDevice().Viewport; mWorldMatrix = BRenderDevice.getDevice().Transform.World; mViewMatrix = BRenderDevice.getDevice().Transform.View; mProjectionMatrix = BRenderDevice.getDevice().Transform.Projection; mBackBuffer = BRenderDevice.getDevice().GetRenderTarget(0); mDepthStencil = BRenderDevice.getDevice().DepthStencilSurface; }