three.js 场景编辑器 源码解析(十三)

本文详细解析了一个用于维护编辑器操作命令的历史逻辑处理模块,通过撤销、重做功能实现对操作的回溯,同时介绍了命令存储、序列化及内存管理机制。

本章讲解历史逻辑处理editor\js\History.js,这个文件的主要作用是维护所有的操作命令,已达到可以撤销、重做相关命令的目的,其中有3点需要重点说一下,第一点是脚本的编辑操作时不能撤销、重做的,然后就是两次操作的时间很短时(小于500毫秒)也是不能撤销和重做的,最后一点是命令可以存储在内存中,也可以序列化到json中,对命令占用大量内存时比较好。

//历史命令存储栈
History = function ( editor ) {

	this.editor = editor;				//保存全局编辑器
	this.undos = [];					//撤销队列
	this.redos = [];					//重做队列
	this.lastCmdTime = new Date();		//上次的时间
	this.idCounter = 0;					//命令id索引

	this.historyDisabled = false;		//历史启用、禁用
	this.config = editor.config;		//配置

	//Set editor-reference in Command,为甚me要在这里设置,因为没有更合适的地方,命令主要是为撤销、重做封装的
	Command( editor );					//将editor设置为Command的静态成员

	// signals

	var scope = this;
	this.editor.signals.startPlayer.add( function () {	//开始播放时处理
		scope.historyDisabled = true;					//禁用历史
	} );
	this.editor.signals.stopPlayer.add( function () {	//停止播放时处理
		scope.historyDisabled = false;					//启用历史
	} );
};

History.prototype = {
	//执行命令
	execute: function ( cmd, optionalName ) {

		//弹出最后一次命令
		var lastCmd = this.undos[ this.undos.length - 1 ];
		//时间间隔
		var timeDifference = new Date().getTime() - this.lastCmdTime.getTime();

		var isUpdatableCmd = lastCmd &&						//上次命令存在
			lastCmd.updatable &&							//上次命令也是可以更新的
			cmd.updatable &&								//本次命令是可以更新的
			lastCmd.object === cmd.object &&				//这次的命令关联的对象与上次的是否为同一个
			lastCmd.type === cmd.type &&					//这次的命令类型与上次的是否是同一种类型
			lastCmd.script === cmd.script &&				//这次的脚本和上次的脚本是否为同一个脚本
			lastCmd.attributeNa
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值