private void updateMaxFrame() { ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || md.fps <= 0) { oldMaxRenderTime = 0; oldFrameIdx = 0; md.frameCount = 0; return; } int maxRenderTime = particleRenderBox.getMaxRenderTime(); if (maxRenderTime == oldMaxRenderTime && md.fps == oldFPS) { return; } oldMaxRenderTime = maxRenderTime; oldFPS = md.fps; md.frameCount = (int)Math.Ceiling(oldMaxRenderTime / 1000f * md.fps) * 2; //Debug.WriteLine(totalFrame); oldFrameIdx = oldFrameIdx % md.frameCount; Dispatcher.Invoke(() => { keyFrame.MaxFrame = md.frameCount - 1; }); }
private void updateFrame(int frameIdx) { if (oldFrameIdx == frameIdx) { return; } ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } frameIdx = frameIdx % md.frameCount; Dispatcher.Invoke(() => { oldFrameIdx = frameIdx; //bool isLoop = frameIdx >= md.frameCount / 2; //if(isLoop != isFrameInLoop) { // isFrameInLoop = isLoop; // keyFrame.FramePointColor = isLoop ? coFrameLoop : coFrameDef; //} keyFrame.SelectFrame = frameIdx; updateFrameLabel(); }); }
private void setEmitterImage(int idx, string path) { if (path == "") { return; } if (idx < 0 || idx >= ctl.lstVM.Count) { return; } ParticleEditVM vm = ctl.lstVM[idx]; ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } vm.md.path = MainCtl.formatPath(md.path, path); MainCtl.ins.particleEditCtl.updateImage(idx); particleRenderBox.updateEmitterImage(idx); }
private bool updateMaxRenderTime() { ParticleEditModel md = MainModel.ins.particleEditModel; var time = 1; for (int i = 0; i < lstEmitter.Count; ++i) { int ms = (int)(md.lstResource[i].particleLife * 1000); time = Math.Max(time, ms); } if (time == maxRenderTime) { return(false); } maxRenderTime = time; renderTime = 0; for (int i = 0; i < lstEmitter.Count; ++i) { lstEmitter[i].updateAttr(maxRenderTime); } return(true); }
public void onShow(ExportWin _parentWin) { parentWin = _parentWin; lblProgress.Content = ""; progressPrecent = 0; ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } txtWidth.Text = md.width.ToString(); txtHeight.Text = md.height.ToString(); txtFps.Text = md.fps.ToString(); txtFps.Text = md.fps.ToString(); txtFilePath.Text = md.path; txtFileName.Text = md.name + ".png"; maxFrameIdx = md.frameCount - 1; sldStartFrame.Minimum = 0; sldStartFrame.Maximum = maxFrameIdx; sldStartFrame.Value = 0; sldEndFrame.Minimum = 0; sldEndFrame.Maximum = maxFrameIdx; sldEndFrame.Value = maxFrameIdx; txtStartFrame.Text = "0"; txtEndFrame.Text = maxFrameIdx.ToString(); }
private void updateRenderTimeByFrame(int frameIdx) { if (!isEngineInited) { return; } int maxRenderTime = particleRenderBox.getMaxRenderTime(); ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || md.fps <= 0) { return; } renderTime = (int)((float)frameIdx / md.fps * 1000); if (renderTime >= maxRenderTime) { renderTime = maxRenderTime + renderTime % maxRenderTime; } else { renderTime = renderTime % maxRenderTime; } particleRenderBox.setRenderTime(renderTime); }
public void updateRenderBoxSize() { ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } boxWidth = (int)bdRenderBox.ActualWidth; boxHeight = (int)bdRenderBox.ActualHeight; int width = md.width; int height = md.height; //width = Math.Min(width, (int)bdRenderBox.ActualWidth - 2); //height = Math.Min(height, (int)bdRenderBox.ActualHeight - 2); width = boxWidth; height = boxHeight; width = Math.Max(width, 0); height = Math.Max(height, 0); //win.Width = width; //win.Height = height; formHost.Width = width; formHost.Height = height; updateScrollBarSize(); }
private void KeyFrame_SelectFrameChanged(object sender, RoutedEventArgs e) { int idx = keyFrame.SelectFrame; ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } bool isLoop = idx >= md.frameCount / 2; if (isLoop != isFrameInLoop) { isFrameInLoop = isLoop; keyFrame.FramePointColor = isLoop ? coFrameLoop : coFrameDef; } if (oldFrameIdx == idx) { return; } if (idx < 0) { return; } pauseFrame(); //Debug.WriteLine(keyFrame.SelectFrame); oldFrameIdx = idx; updateRenderTimeByFrame(idx); updateFrameLabel(); }
private void cpkBackground_ValueChanged(object sender, RoutedEventArgs e) { if (isEditGlobalAttrByText) { return; } ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } uint co = cpkBackground.Value; co = co & 0xffffff; md.background = Convert.ToString(co, 16); particleRenderBox.updateGlobalAttr(); isEditGlobalAttrByUI = true; atxProject.updateText(); isEditGlobalAttrByUI = false; }
private void _renderOneBuffer(bool isTransplate, int frameIdx = -1) { ParticleEditModel md = MainModel.ins.particleEditModel; int w = md.width; int h = md.height; int size = w * h * pxChannel; try { initOutputBuffer(); Gl.BindFramebuffer(FramebufferTarget.Framebuffer, glbufOutput); if (isTransplate) { glClear(0); } //glClear(0x00808080); renderGlToBuffer(frameIdx); glClear(md.background, 1); Gl.ReadPixels(0, 0, w, h, OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, mlBufferOutput.Address); Gl.BindFramebuffer(FramebufferTarget.Framebuffer, 0); } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } }
private void setSelectEmitter(int idx) { if (idx < 0 || idx >= ctl.lstVM.Count) { return; } if (idx == selectEmitter) { return; } if (vm.IsSelectProjectName) { vm.IsSelectProjectName = false; atxProject.Visibility = Visibility.Collapsed; grdSetUIProject.Visibility = Visibility.Collapsed; atxEmitter.Visibility = Visibility.Visible; } if (selectEmitter >= 0 && selectEmitter < ctl.lstVM.Count) { ctl.lstVM[selectEmitter].IsSelect = false; } selectEmitter = idx; lstRes.SelectedIndex = idx; ctl.lstVM[idx].IsSelect = true; //updateAttrText(); ParticleEditModel md = MainModel.ins.particleEditModel; atxEmitter.setModel(md.lstResource[idx]); }
public void init() { try { clear(); ParticleEditModel md = MainModel.ins.particleEditModel; //maxRenderTime = 5 * 1000; maxRenderTime = 1; for (int i = 0; i < md.lstResource.Count; ++i) { int ms = (int)(md.lstResource[i].particleLife * 1000); maxRenderTime = Math.Max(maxRenderTime, ms); } for (int i = 0; i < md.lstResource.Count; ++i) { ParticleEmitter emt = new ParticleEmitter(md.lstResource[i], maxRenderTime); lstEmitter.Add(emt); } //udpateImage(); updateRenderBoxSize(); if (isEngineInited) { //update(); initOutputBuffer(); } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } }
private void renderGlToBuffer(int frameIdx = -1) { ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || md.width == 0 || md.height == 0) { return; } float x = 0; float y = 0; int w = md.width; int h = md.height; int time = renderTime; if (frameIdx >= 0) { time = (int)((float)frameIdx / md.fps * 1000); } //int vpx = 0; //int vpy = 0; //int vpw = w; //int vph = h; //Gl.Viewport(vpx, vpy, vpw, vph); //Gl.Clear(ClearBufferMask.ColorBufferBit); //Gl.MatrixMode(MatrixMode.Projection); //Gl.LoadIdentity(); //Gl.Ortho(0.0, w, 0.0, h, 0.0, 1.0); //Gl.MatrixMode(MatrixMode.Modelview); //Gl.LoadIdentity(); Gl.BlendFuncSeparate(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha, BlendingFactor.One, BlendingFactor.OneMinusSrcAlpha); Gl.BlendEquation(BlendEquationMode.FuncAdd); renderInitMatrix(w, h); //mask if (md.isMaskBox) { Gl.Enable(EnableCap.ScissorTest); Gl.Scissor((int)x, (int)y, md.width, md.height); } //emitter for (int i = 0; i < lstEmitter.Count; ++i) { lstEmitter[i].setStartPos((int)x, (int)y); lstEmitter[i].render(bufferMVP, time); } //mask if (md.isMaskBox) { Gl.Disable(EnableCap.ScissorTest); } }
public JsonResult Edit(ParticleEditModel model) { var objectId = ObjectId.GenerateNewId(); if (!string.IsNullOrEmpty(model.ID) && !ObjectId.TryParse(model.ID, out objectId)) { return(Json(new { Code = 300, Msg = "ID is not allowed." })); } if (string.IsNullOrEmpty(model.Name)) { return(Json(new { Code = 300, Msg = "Name is not allowed to be empty." })); } var mongo = new MongoHelper(); var pinyin = PinYinHelper.GetTotalPinYin(model.Name); var filter = Builders <BsonDocument> .Filter.Eq("ID", objectId); var update1 = Builders <BsonDocument> .Update.Set("Name", model.Name); var update2 = Builders <BsonDocument> .Update.Set("TotalPinYin", pinyin.TotalPinYin); var update3 = Builders <BsonDocument> .Update.Set("FirstPinYin", pinyin.FirstPinYin); var update4 = Builders <BsonDocument> .Update.Set("Thumbnail", model.Thumbnail); UpdateDefinition <BsonDocument> update5; if (string.IsNullOrEmpty(model.Category)) { update5 = Builders <BsonDocument> .Update.Unset("Category"); } else { update5 = Builders <BsonDocument> .Update.Set("Category", model.Category); } var update = Builders <BsonDocument> .Update.Combine(update1, update2, update3, update4, update5); mongo.UpdateOne(Constant.ParticleCollectionName, filter, update); return(Json(new { Code = 200, Msg = "Saved successfully!" })); }
private void initOutputBuffer() { ParticleEditModel md = MainModel.ins.particleEditModel; //if(md == null || md.width == 0 || md.height == 0) { // return; //} if (bufWidth == md.width && bufHeight == md.height) { return; } int w = md.width; int h = md.height; bufWidth = w; bufHeight = h; bufferMVP = calcMVP(w, h); //Gl.Enable(EnableCap.FramebufferSrgb); if (mlBufferCache != null) { mlBufferCache.Dispose(); } if (mlBufferOutput != null) { mlBufferOutput.Dispose(); } int size = w * h * pxChannel; bufferCache = new byte[size]; mlBufferCache = new MemoryLock(bufferCache); bufferOutput = new byte[size]; mlBufferOutput = new MemoryLock(bufferOutput); //Gl.BufferData(BufferTarget.PixelPackBuffer, (uint)size, mlImageData.Address, BufferUsage.DynamicRead); Gl.BindTexture(TextureTarget.Texture2d, glbufTexCache); Gl.TexParameter(TextureTarget.Texture2d, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder); Gl.TexParameter(TextureTarget.Texture2d, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorder); //Gl.TexParameter(TextureTarget.Texture2d, TextureParameterName.TextureWrapR, (int)TextureWrapMode.Repeat); Gl.TexParameter(TextureTarget.Texture2d, TextureParameterName.TextureMagFilter, (int)TextureMinFilter.Linear); Gl.TexParameter(TextureTarget.Texture2d, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); //Gl.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (int)LightEnvModeSGIX.Replace); Gl.TexImage2D(TextureTarget.Texture2d, 0, InternalFormat.Rgba, w, h, 0, OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, mlBufferCache.Address); Gl.BindTexture(TextureTarget.Texture2d, 0); Gl.BindFramebuffer(FramebufferTarget.Framebuffer, glbufOutput); Gl.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2d, glbufTexCache, 0); Gl.BindFramebuffer(FramebufferTarget.Framebuffer, 0); }
public ImageModel renderToBuffer(int frameIdx = -1, bool isTransplate = false) { if (!isEngineInited) { return(null); } ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || md.width == 0 || md.height == 0) { return(null); } int w = md.width; int h = md.height; int size = w * h * pxChannel; byte[] data1 = new byte[size]; _renderOneBuffer(isTransplate, frameIdx); Array.Copy(bufferOutput, 0, data1, 0, size); //byte[] data2 = new byte[size]; //_renderOneBuffer(0x00ffffff); //Array.Copy(bufferOutput, 0, data2, 0, size); //for(int i = 0; i < data1.Length; ++i) { // data1[i] = (byte)((data1[i] + data2[i]) / 2); //} const int imageChannel = 4; if (isTransplate) { for (int x = 0; x < w; ++x) { for (int y = 0; y < h; ++y) { int idx = (y * w + x) * imageChannel; if (data1[idx + 3] == 0) { continue; } data1[idx + 0] = (byte)(data1[idx + 0] / ((float)(data1[idx + 3]) / 255)); data1[idx + 1] = (byte)(data1[idx + 1] / ((float)(data1[idx + 3]) / 255)); data1[idx + 2] = (byte)(data1[idx + 2] / ((float)(data1[idx + 3]) / 255)); } } } return(new ImageModel() { width = w, height = h, data = data1, }); }
public void load(string path) { if (!isEngineInited) { cachePath = path; return; } selectEmitter = -1; vm.IsSelectProjectName = true; path = MainCtl.getFullPath(path); ctl = MainCtl.ins.particleEditCtl; ctl.load(path); lstRes.ItemsSource = ctl.lstVM; ParticleEditModel md = MainModel.ins.particleEditModel; lblProjName.Content = md.name; atxProject.setModel(md); setCpkBackgroundColor(md.background); //dgrdAttr.ItemsSource = ctl.lstAttrMd; //ctl.initAttr(0); //formHost.Child = pnlRender; //win = new PointRenderWin(); //win.onLoaded = () => { // Dispatcher.Invoke(() => { // initRenderWin(); // }); //}; //win.Show(); EventServer.ins.mainWinExited += () => { try { //win.Close(); ctl.save(); } catch (Exception) { } }; particleRenderBox.init(); updateMaxFrame(); //if (ctl.md.lstResource.Count > 0) { // selectEmitter = 0; // updateAttrText(); //} }
public void removeEmitter(int idx) { ParticleEditModel md = MainModel.ins.particleEditModel; ParticleEmitter emt = lstEmitter[idx]; lstEmitter.RemoveAt(idx); emt.Dispose(); updateMaxRenderTime(); }
public void createEmitter(int idx) { ParticleEditModel md = MainModel.ins.particleEditModel; ParticleEmitter emt = new ParticleEmitter(md.lstResource[idx], maxRenderTime); lstEmitter.Add(emt); bool isUpdate = updateMaxRenderTime(); if (!isUpdate) { emt.updateAttr(); } }
public void updateGlobalAttr() { if (!isEngineInited) { return; } try { ParticleEditModel md = MainModel.ins.particleEditModel; glClear(md.background); updateRenderBoxSize(); } catch (Exception) { } }
private void glControl_ContextCreated(object sender, GlControlEventArgs e) { Gl.Enable(EnableCap.AlphaTest); Gl.Enable(EnableCap.Blend); Gl.Enable(EnableCap.Texture2d); //Gl.Enable(EnableCap.PolygonSmooth); //Gl.Enable(EnableCap.LineSmooth); //Gl.Disable(EnableCap.CullFace); //Gl.PolygonMode(MaterialFace.Back, PolygonMode.Fill); //Gl.PolygonMode(MaterialFace.Front, PolygonMode.Fill); //Gl.Enable(EnableCap.DepthTest); //Gl.Enable(EnableCap.Multisample); //Gl.Enable(EnableCap.PrimitiveRestart); Gl.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); //Gl.DepthFunc(DepthFunction.Less); glbufTexCache = Gl.GenTexture(); glbufOutput = Gl.GenFramebuffer(); Gl.BindFramebuffer(FramebufferTarget.Framebuffer, glbufOutput); Gl.DrawBuffers(Gl.COLOR_ATTACHMENT0); Gl.ReadBuffer(ReadBufferMode.ColorAttachment0); Gl.BindFramebuffer(FramebufferTarget.Framebuffer, 0); updateGlSize(); //Gl.ClearColor(27 / 255f, 28 / 255f, 32 / 255f, 1.0f); //glClear("1e2027"); //glClear("24252c", 1); ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { glClear("24252c", 1); } else { glClear(md.background, 1); } //glClear(0, 1); isEngineInited = true; EventServer.ins.onPointEngineInited(); }
private void BtnNextFrame_Click(object sender, RoutedEventArgs e) { pauseFrame(); ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } int idx = oldFrameIdx + 1; if (idx >= md.frameCount) { return; } updateRenderTimeByFrame(idx); updateFrame(idx); keyFrame.setSelectFrameCenter(); }
private void atxProject_TextChangedByUser(object sender, RoutedEventArgs e) { if (!isEngineInited) { return; } if (isEditGlobalAttrByUI) { return; } particleRenderBox.updateGlobalAttr(); updateMaxFrame(); ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } setCpkBackgroundColor(md.background); }
public void load(string path) { path = path.Trim(new char[] { '/', '\\', ' ', '\t' }); string xmlPath = path + "/config.gife"; md = new ParticleEditModel(); md.path = path; md.name = new Regex(".*?([^\\/]*$)").Replace(path, "$1"); srv = new XmlModelServer(md, xmlPath); md.srv = srv; md.srv.loadFromXml(); MainModel.ins.particleEditModel = md; //md.srv.save(); lstVM.Clear(); for (int i = 0; i < md.lstResource.Count; ++i) { string imgPath = md.lstResource[i].path; ImageSource img = loadImage(imgPath, path); ParticleEditVM vm = new ParticleEditVM() { idx = i, md = md.lstResource[i], Image = img, ImgName = Path.GetFileName(imgPath) }; lstVM.Add(vm); } if (lstVM.Count > 0) { lstVM.Last().IsLast = true; } }
private void updateScrollBarSize() { ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || boxWidth == 0 || boxHeight == 0) { return; } int gap = 50; int maxHor = (md.width + gap * 2 - boxWidth) / 2; maxHor = Math.Max(0, maxHor); slbHor.ViewportSize = boxWidth; slbHor.Minimum = -maxHor; slbHor.Maximum = maxHor; if (md.width < boxWidth) { slbHor.Value = 0; //slbHor.Minimum = 0; //slbHor.Maximum = 0; } int maxVer = (md.height + gap * 2 - boxHeight) / 2; maxVer = Math.Max(0, maxVer); slbVer.ViewportSize = boxHeight; slbVer.Minimum = -maxVer; slbVer.Maximum = maxVer; if (md.height < boxHeight) { slbVer.Value = 0; //slbVer.Minimum = 0; //slbVer.Maximum = 0; } }
private void BtnOk_Click(object sender, RoutedEventArgs e) { ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null) { return; } string fileName = txtFileName.Text.Trim(); if (fileName == "") { return; } string path = txtFilePath.Text.Trim(); if (path != "") { path = path + "/" + fileName; } int start = Math.Max(0, Math.Min(startFrame, maxFrameIdx)); int end = Math.Max(0, Math.Min(endFrame, maxFrameIdx)); int count = end - start + 1; if (count <= 0) { return; } progressPrecent = 0; lblProgress.Content = ""; btnOk.IsEnabled = false; exportCtl.saveAsAPNG(path, start, count, md.fps); }
private void timerProc(object value) { if (!isEngineInited) { return; } int maxRenderTime = particleRenderBox.getMaxRenderTime(); //updateMaxFrame(maxRenderTime); if (isRenderPause || isWaitRender) { return; } ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || md.fps <= 0) { return; } float gapTime = glTime.getTime(); if (maxRenderTime == 0) { return; } //if(maxRenderTime != oldMaxRenderTime) { // oldMaxRenderTime = maxRenderTime; // updateMaxFrame(); //} if (md.frameCount == 0) { return; } renderTime = (int)(renderTime + gapTime); if (renderTime >= maxRenderTime) { renderTime = maxRenderTime + renderTime % maxRenderTime; } else { renderTime = renderTime % maxRenderTime; } particleRenderBox.setRenderTime(renderTime); int frameIdx = (int)(renderTime / 1000f * md.fps); //frameIdx = frameIdx % totalFrame; //if(frameIdx == oldFrameIdx) { // return; //} //oldFrameIdx = frameIdx; updateFrame(frameIdx); //lblTest.Content = frameIdx; //if(frameIdx > 237) { // Debug.WriteLine(frameIdx); //} //particleRenderBox.setRenderTime((int)(oldFrameIdx * 1000f / md.fps)); }
public ParticleEditBox() { InitializeComponent(); DataContext = vm; coFrameDef = keyFrame.FramePointColor; coFrameLoop = FindResource("coFrameLoop") as Brush; MainCtl.ins.getImageModelByFrame = particleRenderBox.renderToBuffer; exportCtl.getImageModelByFrame = particleRenderBox.renderToBuffer; EventServer.ins.pointEngineInited += () => { isEngineInited = true; if (cachePath != "") { string path = cachePath; cachePath = ""; load(path); } }; EventServer.ins.updateFPS += (fps) => { lblFps.Content = fps; }; EventServer.ins.copyToClipboard += () => { ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || md.fps <= 0) { return; } //ImageModel md = particleRenderBox.renderToBuffer(); //saveImage(md, "bbb.png"); //saveToClipboard(md); //imageDataCtl.saveToClipboard(); //imageDataCtl.saveAsPng("bbb.png", 60); //int frameTime = (int)(1000f / md.fps + 0.5f); //imageDataCtl.saveAsGif("bbb.gif", 0, 60, frameTime); exportCtl.saveAsAPNG("ccc.png", 0, 240, md.fps); }; EventServer.ins.preOpenExportWin += () => { isWaitRender = true; particleRenderBox.startAnimation(false); }; EventServer.ins.CloseExportWin += () => { glTime.getTime(); isWaitRender = false; particleRenderBox.startAnimation(true); }; EventServer.ins.mainWinExited += () => { timer.Change(Timeout.Infinite, 15); }; initAttr(); //initAttrDesc(); timer = new Timer(new TimerCallback(timerProc), null, 0, 15); //timer.Interval = TimeSpan.FromMilliseconds(8); //timer.Tick += Timer_Tick; //timer.Start(); }
private void renderGl() { ParticleEditModel md = MainModel.ins.particleEditModel; if (md == null || md.width == 0 || md.height == 0) { return; } float x = slbX + (boxWidth - md.width) / 2 + 0.5f; float y = slbY + (boxHeight - md.height) / 2 + 0.5f; var w = boxWidth; var h = boxHeight; //int vpx = 0; //int vpy = 0; //int vpw = w; //int vph = h; //Gl.Viewport(vpx, vpy, vpw, vph); //Gl.Clear(ClearBufferMask.ColorBufferBit); //Gl.MatrixMode(MatrixMode.Projection); //Gl.LoadIdentity(); //Gl.Ortho(0.0, w, 0.0, h, 0.0, 1.0); //Gl.MatrixMode(MatrixMode.Modelview); //Gl.LoadIdentity(); Gl.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); renderInitMatrix(w, h); //line 1 float xl1 = x; float yl1 = y; Gl.LineWidth(1f); Gl.Begin(PrimitiveType.LineLoop); Gl.Color3(1.0f, 1.0f, 1.0f); Gl.Vertex2(xl1, yl1); Gl.Vertex2(xl1 + md.width, yl1); Gl.Vertex2(xl1 + md.width, yl1 + md.height); Gl.Vertex2(xl1, yl1 + md.height); Gl.End(); //line 2 float xl2 = x - 1; float yl2 = y - 1; Gl.Begin(PrimitiveType.LineLoop); Gl.Color3(0.0f, 0.0f, 0.0f); Gl.Vertex2(xl2, yl2); Gl.Vertex2(xl2 + md.width + 2, yl2); Gl.Vertex2(xl2 + md.width + 2, yl2 + md.height + 2); Gl.Vertex2(xl2, yl2 + md.height + 2); Gl.End(); //mask if (md.isMaskBox) { Gl.Enable(EnableCap.ScissorTest); Gl.Scissor((int)x, (int)y, md.width, md.height); } //emitter for (int i = 0; i < lstEmitter.Count; ++i) { lstEmitter[i].setStartPos((int)x, (int)y); lstEmitter[i].render(mMVP, renderTime); } //mask if (md.isMaskBox) { Gl.Disable(EnableCap.ScissorTest); } }