示例#1
0
        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;
            });
        }
示例#2
0
        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();
            });
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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();
        }
示例#6
0
        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);
        }
示例#7
0
        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();
        }
示例#8
0
        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();
        }
示例#9
0
        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;
        }
示例#10
0
        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());
            }
        }
示例#11
0
        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]);
        }
示例#12
0
        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());
            }
        }
示例#13
0
        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!"
            }));
        }
示例#15
0
        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);
        }
示例#16
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,
            });
        }
示例#17
0
        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();
            //}
        }
示例#18
0
        public void removeEmitter(int idx)
        {
            ParticleEditModel md = MainModel.ins.particleEditModel;

            ParticleEmitter emt = lstEmitter[idx];

            lstEmitter.RemoveAt(idx);

            emt.Dispose();

            updateMaxRenderTime();
        }
示例#19
0
        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();
            }
        }
示例#20
0
        public void updateGlobalAttr()
        {
            if (!isEngineInited)
            {
                return;
            }

            try {
                ParticleEditModel md = MainModel.ins.particleEditModel;

                glClear(md.background);

                updateRenderBoxSize();
            } catch (Exception) {
            }
        }
示例#21
0
        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();
        }
示例#22
0
        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();
        }
示例#23
0
        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);
        }
示例#24
0
        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;
            }
        }
示例#25
0
        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;
            }
        }
示例#26
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);
        }
示例#27
0
        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));
        }
示例#28
0
        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();
        }
示例#29
0
        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);
            }
        }