diff --git a/.gitignore b/.gitignore index f54921af..2bab5b60 100755 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,8 @@ quick_gen_project_*_autogen.sh quick_gen_project_*_autogen.sh.meta .exvim.app *.swp +*.un~ +tags #///////////////////////////////////////////////////////////////////////////// # webstorm files diff --git a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs index c6526039..362d8037 100644 --- a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs +++ b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs @@ -18,11 +18,14 @@ enum EditBoxInputMode:byte {Any, EmailAddress, Numeric, PhoneNumber, URL, Decime enum LabelOverflowType:byte {None, Clamp, Shrink, ResizeHeight, Toggle} enum MaskType:byte {Rect, Ellipse, ImageStencil} enum ColliderType:byte {BoxCollider, PolygonCollider, CircleCollider} +enum LayoutType:byte { None = 0, Horizontal = 1, Vertical = 2, Grid = 3 } +enum ResizeMode:byte { None = 0, Container = 1, Children = 2 } // New nodes should be added at the end of the union // no more than 255 union objects can be added -union AnyNode {Scene, Sprite, Label, Particle, TileMap, Node, Button, ProgressBar, ScrollView, CreatorScene, - EditBox, RichText, SpineSkeleton, VideoPlayer, WebView, Slider, Toggle, ToggleGroup, PageView, Mask, DragonBones, MotionStreak} +union AnyNode {Scene, Sprite, Label, Particle, TileMap, Node, Button, ProgressBar, ScrollView, CreatorScene, + EditBox, RichText, SpineSkeleton, VideoPlayer, WebView, Slider, Toggle, ToggleGroup, PageView, + Mask, DragonBones, MotionStreak, Layout} table SceneGraph { @@ -180,6 +183,14 @@ table Button ignoreContentAdaptWithSize:bool = false; } +table Layout +{ + node:Node; + layoutType:LayoutType; + resizeMode:ResizeMode; + backgroundVisible:bool = true; +} + table ProgressBar { node:Node; diff --git a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js index b5b75b77..4c2f2510 100644 --- a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js +++ b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js @@ -32,6 +32,7 @@ class BuildWorker extends WorkerBase { this._compileJsonToBinary(function() { this._copyResources(copyReourceInfos); Editor.Ipc.sendToAll('creator-luacpp-support:state-changed', 'finish', 100); + this._callback(); Utils.log('[creator-luacpp-support] build end'); }.bind(this)); diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Button.js b/creator_project/packages/creator-luacpp-support/core/parser/Button.js index 0f806b4e..2147b1a3 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Button.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Button.js @@ -40,4 +40,4 @@ class Button extends Node { } } -module.exports = Button; \ No newline at end of file +module.exports = Button; diff --git a/creator_project/packages/creator-luacpp-support/core/parser/ConvertFireToJson.js b/creator_project/packages/creator-luacpp-support/core/parser/ConvertFireToJson.js index 9ee63007..1c7d2974 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/ConvertFireToJson.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/ConvertFireToJson.js @@ -108,6 +108,7 @@ class FireParser { fs.close(this._json_file); } }); + } } @@ -130,4 +131,4 @@ function parse_fire(filenames, assetpath, path_to_json_files, uuidmaps) { return uuid; } -module.exports = parse_fire; \ No newline at end of file +module.exports = parse_fire; diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Layout.js b/creator_project/packages/creator-luacpp-support/core/parser/Layout.js new file mode 100644 index 00000000..860da52d --- /dev/null +++ b/creator_project/packages/creator-luacpp-support/core/parser/Layout.js @@ -0,0 +1,57 @@ +const Node = require('./Node'); +const Utils = require('./Utils'); +const state = require('./Global').state; + +class Layout extends Node { + // Example Layout structure + /* { + "__type__": "cc.Layout", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "_layoutSize": { + "__type__": "cc.Size", + "width": 200, + "height": 150 + }, + "_resize": 0, + "_N$layoutType": 0, + "_N$padding": 0, + "_N$cellSize": { + "__type__": "cc.Size", + "width": 40, + "height": 40 + }, + "_N$startAxis": 0, + "_N$paddingLeft": 0, + "_N$paddingRight": 0, + "_N$paddingTop": 0, + "_N$paddingBottom": 0, + "_N$spacingX": 0, + "_N$spacingY": 0, + "_N$verticalDirection": 1, + "_N$horizontalDirection": 0 + } */ + constructor(data) { + super(data); + this._jsonNode.object_type = 'Layout'; + } + + parse_properties() { + super.parse_properties(); + this._properties = {node: this._properties}; + + let spr_component = Node.get_node_component_of_type(this._node_data, 'cc.Sprite'); + this._properties.backgroundVisible = spr_component._enabled; + + let lay_component = Node.get_node_component_of_type(this._node_data, 'cc.Layout'); + this._properties.layoutType = lay_component._N$layoutType; + this._properties.resizeMode = lay_component._resize; + + } +} + +module.exports = Layout; diff --git a/creator_project/packages/creator-luacpp-support/core/parser/MotionStreak.js b/creator_project/packages/creator-luacpp-support/core/parser/MotionStreak.js index 725b84b1..b4070233 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/MotionStreak.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/MotionStreak.js @@ -31,4 +31,4 @@ class MotionStreak extends Node { } } -module.exports = MotionStreak; \ No newline at end of file +module.exports = MotionStreak; diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Node.js b/creator_project/packages/creator-luacpp-support/core/parser/Node.js index fba99c64..8023de49 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Node.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Node.js @@ -47,20 +47,20 @@ class Node { static guess_type_from_components(components) { // ScrollView, Button & ProgressBar should be before Sprite - let supported_components = ['cc.Button', 'cc.ProgressBar', 'cc.ScrollView', + let supported_components = ['cc.Button', 'cc.ProgressBar', 'cc.ScrollView', 'cc.Layout', 'cc.EditBox', 'cc.Label', 'sp.Skeleton', 'cc.Sprite', 'cc.ParticleSystem', 'cc.TiledMap', 'cc.Canvas', 'cc.RichText', 'cc.VideoPlayer', 'cc.WebView', 'cc.Slider', 'cc.Toggle', 'cc.ToggleGroup', 'cc.PageView', 'cc.Mask', 'dragonBones.ArmatureDisplay']; - + if (!components) return 'cc.Node'; - + let node_components = components.map(x => x.__type__); // special case for object without components if (node_components.length == 0) return 'cc.Node'; - + for (let i = 0, len = supported_components.length; i < len; ++i) { let supported = supported_components[i]; if (node_components.includes(supported)) { @@ -72,16 +72,19 @@ class Node { Utils.log('treat all unknown components as cc.Node') return 'cc.Node'; } - + static guess_type(node_data) { let components = Node.get_node_components(node_data); - if (components) - return Node.guess_type_from_components(components); - + if (components) { + let guessedType = Node.guess_type_from_components(components); + return guessedType; + } + // prefab don't have componets, should guess type from prefab node data - if (node_data._prefab) + if (node_data._prefab) { return 'cc.Prefab'; - + }; + return null; } @@ -147,7 +150,7 @@ class Node { parse_properties() { // 1st: parse self this.parse_node_properties(); - + // 2nd: parse children this.parse_children(); } @@ -276,7 +279,7 @@ class Node { addProp(props, 'skewX', result, 'skewX'); addProp(props, 'skewY', result, 'skewY'); addProp(props, 'opacity', result, 'opacity'); - + // position -> {x:, y:, curveType?, curveData?} if (props.position) { @@ -316,7 +319,7 @@ class Node { else { let clip_content = JSON.parse(fs.readFileSync(uuidinfos[clip_uuid])); - + // parse curveData let animationClip = { name: clip_content._name, @@ -345,7 +348,7 @@ class Node { // parse self animationclip if (curveData.props) - animationClip.curveData.push({props: parseCurveDataProps(curveData.props)}); + animationClip.curveData.push({props: parseCurveDataProps(curveData.props)}); anim.clips.push(animationClip); state._clips[clip_uuid] = animationClip; diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Utils.js b/creator_project/packages/creator-luacpp-support/core/parser/Utils.js index ee98444e..d5e1f935 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Utils.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Utils.js @@ -40,7 +40,7 @@ let get_sprite_frame_json_by_uuid = function(uuid) { let is_sprite_frame_from_texture_packer = function(uuid) { let json = get_sprite_frame_json_by_uuid(uuid); - if (json) + if (json) return json.content.atlas !== ''; else return false; @@ -86,7 +86,7 @@ let get_sprite_frame_name_by_uuid = function(uuid) { sprite_frame_info.texture_path = path_info.relative_path; sprite_frame_info.is_texture_packer = is_texture_packer; - let sprite_frame_uuid = sprite_frame_info.uuid; + let sprite_frame_uuid = sprite_frame_info.uuid; state._sprite_frames[sprite_frame_uuid] = sprite_frame_info; if (sprite_frame_uuid == uuid) { @@ -164,16 +164,16 @@ let get_spine_info_by_uuid = function (uuid) { let contents = fs.readFileSync(jsonfile); let contents_json = JSON.parse(contents); let current_dir = path.basename(jsonfile, '.json'); - + let res_dir = path.join(path.dirname(jsonfile), uuid); - + let files = fs.readdirSync(res_dir); files.forEach(function(file) { let fullpath = path.join(res_dir, file); //FIXME: have more than one json file? state._uuid[uuid] = {fullpath: fullpath, relative_path: current_dir + '/' + file}; }); - + // get atlas path state._uuid[uuid].atlas_url = get_relative_full_path_by_uuid(contents_json.atlasUrl.__uuid__); // add to _uuid to copy resources @@ -249,62 +249,53 @@ let create_node = function (node_type, node_data) { const Prefab = require('./Prefab'); const DragonBones = require('./DragonBones'); const MotionStreak = require('./MotionStreak'); + const Layout = require('./Layout'); + + let classType = null; + + const classMap = { + 'cc.Node': Node, + 'cc.Sprite': Sprite, + 'cc.Canvas': Canvas, + 'cc.Label': Label, + 'cc.RichText': RichText, + 'cc.Button': Button, + 'cc.ProgressBar': ProgressBar, + 'cc.ScrollView': ScrollView, + 'cc.EditBox': EditBox, + 'cc.TiledMap': TiledMap, + 'cc.ParticleSystem': ParticleSystem, + 'sp.Skeleton': SpineSkeleton, + 'cc.VideoPlayer': VideoPlayer, + 'cc.WebView': WebView, + 'cc.Slider': Slider, + 'cc.Toggle': Toggle, + 'cc.ToggleGroup': ToggleGroup, + 'cc.PageView': PageView, + 'cc.Mask': Mask, + 'cc.Prefab': Prefab, + 'dragonBones.ArmatureDisplay': DragonBones, + 'cc.MotionStreak': MotionStreak, + 'cc.Layout': Layout, + }; + + classType = classMap[node_type] let n = null; - if (node_type === 'cc.Node') - n = new Node(node_data); - else if (node_type === 'cc.Sprite') - n = new Sprite(node_data); - else if (node_type === 'cc.Canvas') - n = new Canvas(node_data); - else if (node_type === 'cc.Label') - n = new Label(node_data); - else if (node_type === 'cc.RichText') - n = new RichText(node_data); - else if (node_type === 'cc.Button') - n = new Button(node_data); - else if (node_type === 'cc.ProgressBar') - n = new ProgressBar(node_data); - else if (node_type === 'cc.ScrollView') - n = new ScrollView(node_data); - else if (node_type === 'cc.EditBox') - n = new EditBox(node_data); - else if (node_type === 'cc.TiledMap') - n = new TiledMap(node_data); - else if (node_type === 'cc.ParticleSystem') - n = new ParticleSystem(node_data); - else if (node_type === 'sp.Skeleton') - n = new SpineSkeleton(node_data); - else if (node_type === 'cc.VideoPlayer') - n = new VideoPlayer(node_data); - else if (node_type === 'cc.WebView') - n = new WebView(node_data); - else if (node_type === 'cc.Slider') - n = new Slider(node_data); - else if (node_type === 'cc.Toggle') - n = new Toggle(node_data); - else if (node_type === 'cc.ToggleGroup') - n = new ToggleGroup(node_data); - else if (node_type === 'cc.PageView') - n = new PageView(node_data); - else if (node_type === 'cc.Mask') - n = new Mask(node_data); - else if (node_type === 'cc.Prefab') - n = new Prefab(node_data); - else if (node_type === 'dragonBones.ArmatureDisplay') - n = new DragonBones(node_data); - else if (node_type === 'cc.MotionStreak') - n = new MotionStreak(node_data); - - if (n != null) + + let isValid = typeof(classType) !== "undefined"; + if (isValid) + { + n = new classType(node_data); n.parse_properties(); - + } + return n; } /** * remove a child from node's children by child's id - * @param {node} the Node that to be applied to + * @param {node} the Node that to be applied to * @param {id} child's id */ let remove_child_by_id = function (node, id) { diff --git a/creator_project/packages/creator-luacpp-support/main.js b/creator_project/packages/creator-luacpp-support/main.js index 1f7fb0a6..876d0037 100644 --- a/creator_project/packages/creator-luacpp-support/main.js +++ b/creator_project/packages/creator-luacpp-support/main.js @@ -68,6 +68,7 @@ function _checkProject(opt) { // 'profile' may be null function _build(opt) { if (_buildState !== 'sleep' && _buildState !== 'finish') { + //FIXME this never gets cleared, giving the impression that the plugin is constantly running Editor.warn('[LuaCpp Support] Building in progress'); return; } diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 45989582..21cbc2ea 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -340,6 +340,9 @@ cocos2d::Node* CreatorReader::createTree(const buffers::NodeTree* tree) const node = createButton(static_cast(buffer)); parsing_button = true; break; + case buffers::AnyNode_Layout: + node = createLayout(static_cast(buffer)); + break; case buffers::AnyNode_EditBox: node = createEditBox(static_cast(buffer)); break; @@ -978,6 +981,40 @@ void CreatorReader::parseButton(cocos2d::ui::Button* button, const buffers::Butt } } +cocos2d::ui::Layout* CreatorReader::createLayout(const buffers::Layout* layoutBuffer) const +{ + + ui::Layout* layout = nullptr; + + layout = ui::Layout::create(); + + parseLayout(layout, layoutBuffer); + return layout; +} + +void CreatorReader::parseLayout(cocos2d::ui::Layout* layout, const buffers::Layout* layoutBuffer) const +{ + const auto& nodeBuffer = layoutBuffer->node(); + parseNode(layout, nodeBuffer); + + //use layout type + //NONE, HORIZONTAL, VERTICAL, RELATIVE(/GRID?) + cocos2d::ui::Layout::Type layout_type = static_cast(layoutBuffer->layoutType()); + layout->setLayoutType(layout_type); + + //use color from node + layout->setBackGroundColor(layout->getColor()); + layout->setBackGroundColorType(ui::Layout::BackGroundColorType::SOLID); + if (layoutBuffer->backgroundVisible()) { + layout->setBackGroundColorOpacity(255); + } else { + layout->setBackGroundColorOpacity(0); + }; + + //TODO create resize types (ie container, children) + auto resizeMode = layoutBuffer->resizeMode(); +} + #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) cocos2d::experimental::ui::VideoPlayer* CreatorReader::createVideoPlayer(const buffers::VideoPlayer* videoPlayerBuffer) const { diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h index 8f7cef12..42a545d2 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h @@ -116,6 +116,9 @@ class CreatorReader: public cocos2d::Ref cocos2d::ui::Button* createButton(const buffers::Button* buttonBuffer) const; void parseButton(cocos2d::ui::Button* button, const buffers::Button* buttonBuffer) const; + cocos2d::ui::Layout* createLayout(const buffers::Layout* buttonBuffer) const; + void parseLayout(cocos2d::ui::Layout* button, const buffers::Layout* buttonBuffer) const; + spine::SkeletonAnimation* createSpineSkeleton(const buffers::SpineSkeleton* spineBuffer) const; void parseSpineSkeleton(spine::SkeletonAnimation* button, const buffers::SpineSkeleton* spineBuffer) const; diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h index 22cd2c5c..aa2ce450 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h @@ -34,6 +34,8 @@ struct Scene; struct Button; +struct Layout; + struct ProgressBar; struct ScrollView; @@ -313,6 +315,37 @@ inline const char **EnumNamesColliderType() { inline const char *EnumNameColliderType(ColliderType e) { return EnumNamesColliderType()[static_cast(e)]; } +enum LayoutType { + LayoutType_None = 0, + LayoutType_Horizontal = 1, + LayoutType_Vertical = 2, + LayoutType_Grid = 3, + LayoutType_MIN = LayoutType_None, + LayoutType_MAX = LayoutType_Grid +}; + +inline const char **EnumNamesLayoutType() { + static const char *names[] = { "None", "Horizontal", "Vertical", "Grid", nullptr }; + return names; +} + +inline const char *EnumNameLayoutType(LayoutType e) { return EnumNamesLayoutType()[static_cast(e)]; } + +enum ResizeMode { + ResizeMode_None = 0, + ResizeMode_Container = 1, + ResizeMode_Children = 2, + ResizeMode_MIN = ResizeMode_None, + ResizeMode_MAX = ResizeMode_Children +}; + +inline const char **EnumNamesResizeMode() { + static const char *names[] = { "None", "Container", "Children", nullptr }; + return names; +} + +inline const char *EnumNameResizeMode(ResizeMode e) { return EnumNamesResizeMode()[static_cast(e)]; } + enum AnyNode { AnyNode_NONE = 0, AnyNode_Scene = 1, @@ -337,12 +370,13 @@ enum AnyNode { AnyNode_Mask = 20, AnyNode_DragonBones = 21, AnyNode_MotionStreak = 22, + AnyNode_Layout = 23, AnyNode_MIN = AnyNode_NONE, - AnyNode_MAX = AnyNode_MotionStreak + AnyNode_MAX = AnyNode_Layout }; inline const char **EnumNamesAnyNode() { - static const char *names[] = { "NONE", "Scene", "Sprite", "Label", "Particle", "TileMap", "Node", "Button", "ProgressBar", "ScrollView", "CreatorScene", "EditBox", "RichText", "SpineSkeleton", "VideoPlayer", "WebView", "Slider", "Toggle", "ToggleGroup", "PageView", "Mask", "DragonBones", "MotionStreak", nullptr }; + static const char *names[] = { "NONE", "Scene", "Sprite", "Label", "Particle", "TileMap", "Node", "Button", "ProgressBar", "ScrollView", "CreatorScene", "EditBox", "RichText", "SpineSkeleton", "VideoPlayer", "WebView", "Slider", "Toggle", "ToggleGroup", "PageView", "Mask", "DragonBones", "MotionStreak", "Layout", nullptr }; return names; } @@ -440,6 +474,10 @@ template<> struct AnyNodeTraits { static const AnyNode enum_value = AnyNode_MotionStreak; }; +template<> struct AnyNodeTraits { + static const AnyNode enum_value = AnyNode_Layout; +}; + inline bool VerifyAnyNode(flatbuffers::Verifier &verifier, const void *union_obj, AnyNode type); enum AnimWrapMode { @@ -1530,6 +1568,56 @@ inline flatbuffers::Offset