From 4d70d18e3ed7cd46ecb87a46343b5479b428c4d5 Mon Sep 17 00:00:00 2001 From: Quentin Quadrat Date: Wed, 23 Nov 2022 19:05:00 +0100 Subject: [PATCH] WIP: Reorganize demos #19 Demo "CEF in 2D" is now nammed "Hello CEF" (like initial). Add real demo "CEF in 2D" that will show a full 2D browser. This demo will be used for showing all features (ideally). --- addons/gdcef/demos/2D/CEF.gd | 155 ++++++++++++++++++ addons/gdcef/demos/2D/CEF.tscn | 79 +++++++++ addons/gdcef/demos/2D/icon.png | Bin 37441 -> 23628 bytes addons/gdcef/demos/2D/project.godot | 2 +- addons/gdcef/demos/3D/CEF.tscn | 2 +- addons/gdcef/demos/HelloCEF/CEF.gd | 155 ++++++++++++++++++ addons/gdcef/demos/HelloCEF/CEF.tscn | 77 +++++++++ .../gdcef/demos/{2D => HelloCEF}/Control.gd | 0 .../gdcef/demos/{2D => HelloCEF}/Control.tscn | 0 addons/gdcef/demos/HelloCEF/default_env.tres | 7 + addons/gdcef/demos/HelloCEF/icon.png | Bin 0 -> 37441 bytes addons/gdcef/demos/HelloCEF/libs/gdcef.gdnlib | 18 ++ addons/gdcef/demos/HelloCEF/libs/gdcef.gdns | 9 + addons/gdcef/demos/HelloCEF/project.godot | 33 ++++ addons/gdcef/demos/README.md | 12 +- 15 files changed, 544 insertions(+), 5 deletions(-) create mode 100644 addons/gdcef/demos/2D/CEF.gd create mode 100644 addons/gdcef/demos/2D/CEF.tscn create mode 100644 addons/gdcef/demos/HelloCEF/CEF.gd create mode 100644 addons/gdcef/demos/HelloCEF/CEF.tscn rename addons/gdcef/demos/{2D => HelloCEF}/Control.gd (100%) rename addons/gdcef/demos/{2D => HelloCEF}/Control.tscn (100%) create mode 100644 addons/gdcef/demos/HelloCEF/default_env.tres create mode 100644 addons/gdcef/demos/HelloCEF/icon.png create mode 100644 addons/gdcef/demos/HelloCEF/libs/gdcef.gdnlib create mode 100644 addons/gdcef/demos/HelloCEF/libs/gdcef.gdns create mode 100644 addons/gdcef/demos/HelloCEF/project.godot diff --git a/addons/gdcef/demos/2D/CEF.gd b/addons/gdcef/demos/2D/CEF.gd new file mode 100644 index 0000000..d28b567 --- /dev/null +++ b/addons/gdcef/demos/2D/CEF.gd @@ -0,0 +1,155 @@ +# ============================================================================== +# Demo based on the initial asset https://godotengine.org/asset-library/asset/127 +# Basic application showing how to use CEF inside Godot with a 3D scene and mouse +# and keyboard events. +# ============================================================================== + +extends Control + +# Name of the browser +const browser1 = "browser1" + +# Memorize if the mouse was pressed +var mouse_pressed : bool = false + +# ============================================================================== +# Home button pressed: get the browser node and load a new page. +# ============================================================================== +func _on_Home_pressed(): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.load_url("https://bitbucket.org/chromiumembedded/cef/wiki/Home") + pass + +# ============================================================================== +# Go to previously visited page +# ============================================================================== +func _on_Prev_pressed(): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.previous_page() + pass + +# ============================================================================== +# Go to next page +# ============================================================================== +func _on_Next_pressed(): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.next_page() + pass + +# ============================================================================== +# Callback when a page has ended to load: we print a message +# ============================================================================== +func _on_page_loaded(node): + $Panel/Label.set_text(node.name + ": page " + node.get_url() + " loaded") + +# ============================================================================== +# On new URL entered +# ============================================================================== +func _on_TextEdit_text_changed(new_text): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.load_url(new_text) + +# ============================================================================== +# Get mouse events and broadcast them to CEF +# ============================================================================== +func _on_TextureRect_gui_input(event): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + if event is InputEventMouseButton: + if event.button_index == BUTTON_WHEEL_UP: + browser.on_mouse_wheel_vertical(2) + elif event.button_index == BUTTON_WHEEL_DOWN: + browser.on_mouse_wheel_vertical(-2) + elif event.button_index == BUTTON_LEFT: + mouse_pressed = event.pressed + if event.pressed == true: + browser.on_mouse_left_down() + else: + browser.on_mouse_left_up() + elif event.button_index == BUTTON_RIGHT: + mouse_pressed = event.pressed + if event.pressed == true: + browser.on_mouse_right_down() + else: + browser.on_mouse_right_up() + else: + mouse_pressed = event.pressed + if event.pressed == true: + browser.on_mouse_middle_down() + else: + browser.on_mouse_middle_up() + elif event is InputEventMouseMotion: + if mouse_pressed == true : + browser.on_mouse_left_down() + browser.on_mouse_moved(event.position.x, event.position.y) + pass + +# ============================================================================== +# Make the CEF browser reacts from keyboard events. +# ============================================================================== +func _input(event): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + if event is InputEventKey: + if event.unicode != 0: + browser.on_key_pressed(event.unicode, event.pressed, event.shift, event.alt, event.control) + else: + browser.on_key_pressed(event.scancode, event.pressed, event.shift, event.alt, event.control) + + pass + +# ============================================================================== +# Create a single briwser named "browser1" that is attached as child node to $CEF. +# ============================================================================== +func _ready(): + + # Configuration are: + # resource_path := {"artifacts", CEF_ARTIFACTS_FOLDER} + # resource_path := {"exported_artifacts", application_real_path()} + # {"incognito":false} + # {"cache_path", resource_path / "cache"} + # {"root_cache_path", resource_path / "cache"} + # {"browser_subprocess_path", resource_path / SUBPROCESS_NAME } + # {"log_file", resource_path / "debug.log"} + # {log_severity", "warning"} + # {"remote_debugging_port", 7777} + # {"exception_stack_size", 5} + # + # Configurate CEF. In incognito mode cache directories not used and in-memory + # caches are used instead and no data is persisted to disk. + # + # artifacts: allows path such as "build" or "res://build/". Note that "res://" + # will use ProjectSettings.globalize_path but exported projects don't support globalize_path: + # https://docs.godotengine.org/en/3.5/classes/class_projectsettings.html#class-projectsettings-method-globalize-path + var resource_path = "res://build/" + if !$CEF.initialize({"artifacts":resource_path, "incognito":true, "locale":"en-US"}): + push_error("Failed initializing CEF") + get_tree().quit() + pass + + var S = $Panel/TextureRect.get_size() + var browser = $CEF.create_browser("https://github.com/Lecrapouille/gdcef", browser1, S.x, S.y, {"javascript":true}) + browser.connect("page_loaded", self, "_on_page_loaded") + $Panel/TextureRect.texture = browser.get_texture() + +# ============================================================================== +# $CEF is periodically updated +# ============================================================================== +func _process(_delta): + pass diff --git a/addons/gdcef/demos/2D/CEF.tscn b/addons/gdcef/demos/2D/CEF.tscn new file mode 100644 index 0000000..4892557 --- /dev/null +++ b/addons/gdcef/demos/2D/CEF.tscn @@ -0,0 +1,79 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://CEF.gd" type="Script" id=1] +[ext_resource path="res://libs/gdcef.gdns" type="Script" id=2] + +[node name="GUI" type="Control"] +margin_right = 280.0 +margin_bottom = 180.0 +mouse_filter = 1 +script = ExtResource( 1 ) + +[node name="CEF" type="Node" parent="."] +script = ExtResource( 2 ) + +[node name="Panel" type="Panel" parent="."] +anchor_right = 2.504 +anchor_bottom = 1.856 +margin_right = 323.88 +margin_bottom = 262.92 + +[node name="TextureRect" type="TextureRect" parent="Panel"] +anchor_top = 0.015 +anchor_bottom = 0.015 +margin_left = 5.0 +margin_top = 28.045 +margin_right = 1019.0 +margin_bottom = 559.045 +mouse_filter = 0 +expand = true + +[node name="Label" type="Label" parent="Panel"] +margin_left = 5.0 +margin_top = 578.0 +margin_right = 82.0 +margin_bottom = 592.0 +mouse_filter = 0 +text = "Hello world!" + +[node name="Label2" type="Label" parent="Panel"] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 41.0 +margin_bottom = 21.0 +mouse_filter = 0 +text = "URL:" + +[node name="Home" type="Button" parent="Panel"] +margin_left = 208.0 +margin_top = 3.0 +margin_right = 259.0 +margin_bottom = 25.0 +text = "Home" + +[node name="Prev" type="Button" parent="Panel"] +margin_left = 186.0 +margin_top = 3.0 +margin_right = 206.0 +margin_bottom = 25.0 +text = "<" + +[node name="Next" type="Button" parent="Panel"] +margin_left = 259.0 +margin_top = 3.0 +margin_right = 279.0 +margin_bottom = 25.0 +text = ">" + +[node name="TextEdit" type="LineEdit" parent="Panel"] +margin_left = 43.0 +margin_top = 2.0 +margin_right = 185.0 +margin_bottom = 26.0 + +[connection signal="gui_input" from="Panel/TextureRect" to="." method="_on_TextureRect_gui_input"] +[connection signal="pressed" from="Panel/Home" to="." method="_on_Home_pressed"] +[connection signal="pressed" from="Panel/Prev" to="." method="_on_Prev_pressed"] +[connection signal="pressed" from="Panel/Next" to="." method="_on_Prev_pressed"] +[connection signal="pressed" from="Panel/Next" to="." method="_on_Next_pressed"] +[connection signal="text_changed" from="Panel/TextEdit" to="." method="_on_TextEdit_text_changed"] diff --git a/addons/gdcef/demos/2D/icon.png b/addons/gdcef/demos/2D/icon.png index aeffb9176ea53a23c671fa7d3565be2ecda60f73..e185e631b645fac7535c747f287b59d9a348874e 100644 GIT binary patch delta 19965 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 ck4yi5S|$>JRtGVb(^b diff --git a/addons/gdcef/demos/2D/project.godot b/addons/gdcef/demos/2D/project.godot index 6385011..d78e1a8 100644 --- a/addons/gdcef/demos/2D/project.godot +++ b/addons/gdcef/demos/2D/project.godot @@ -21,7 +21,7 @@ _global_script_class_icons={ [application] config/name="CEF in 2D" -run/main_scene="res://Control.tscn" +run/main_scene="res://CEF.tscn" config/icon="res://icon.png" [physics] diff --git a/addons/gdcef/demos/3D/CEF.tscn b/addons/gdcef/demos/3D/CEF.tscn index 2f8f434..13949b6 100644 --- a/addons/gdcef/demos/3D/CEF.tscn +++ b/addons/gdcef/demos/3D/CEF.tscn @@ -72,6 +72,6 @@ margin_bottom = 26.0 [connection signal="gui_input" from="Panel/TextureRect" to="." method="_on_TextureRect_gui_input"] [connection signal="pressed" from="Panel/Home" to="." method="_on_Home_pressed"] [connection signal="pressed" from="Panel/Prev" to="." method="_on_Prev_pressed"] -[connection signal="pressed" from="Panel/Next" to="." method="_on_Next_pressed"] [connection signal="pressed" from="Panel/Next" to="." method="_on_Prev_pressed"] +[connection signal="pressed" from="Panel/Next" to="." method="_on_Next_pressed"] [connection signal="text_changed" from="Panel/TextEdit" to="." method="_on_TextEdit_text_changed"] diff --git a/addons/gdcef/demos/HelloCEF/CEF.gd b/addons/gdcef/demos/HelloCEF/CEF.gd new file mode 100644 index 0000000..d28b567 --- /dev/null +++ b/addons/gdcef/demos/HelloCEF/CEF.gd @@ -0,0 +1,155 @@ +# ============================================================================== +# Demo based on the initial asset https://godotengine.org/asset-library/asset/127 +# Basic application showing how to use CEF inside Godot with a 3D scene and mouse +# and keyboard events. +# ============================================================================== + +extends Control + +# Name of the browser +const browser1 = "browser1" + +# Memorize if the mouse was pressed +var mouse_pressed : bool = false + +# ============================================================================== +# Home button pressed: get the browser node and load a new page. +# ============================================================================== +func _on_Home_pressed(): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.load_url("https://bitbucket.org/chromiumembedded/cef/wiki/Home") + pass + +# ============================================================================== +# Go to previously visited page +# ============================================================================== +func _on_Prev_pressed(): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.previous_page() + pass + +# ============================================================================== +# Go to next page +# ============================================================================== +func _on_Next_pressed(): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.next_page() + pass + +# ============================================================================== +# Callback when a page has ended to load: we print a message +# ============================================================================== +func _on_page_loaded(node): + $Panel/Label.set_text(node.name + ": page " + node.get_url() + " loaded") + +# ============================================================================== +# On new URL entered +# ============================================================================== +func _on_TextEdit_text_changed(new_text): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + browser.load_url(new_text) + +# ============================================================================== +# Get mouse events and broadcast them to CEF +# ============================================================================== +func _on_TextureRect_gui_input(event): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + if event is InputEventMouseButton: + if event.button_index == BUTTON_WHEEL_UP: + browser.on_mouse_wheel_vertical(2) + elif event.button_index == BUTTON_WHEEL_DOWN: + browser.on_mouse_wheel_vertical(-2) + elif event.button_index == BUTTON_LEFT: + mouse_pressed = event.pressed + if event.pressed == true: + browser.on_mouse_left_down() + else: + browser.on_mouse_left_up() + elif event.button_index == BUTTON_RIGHT: + mouse_pressed = event.pressed + if event.pressed == true: + browser.on_mouse_right_down() + else: + browser.on_mouse_right_up() + else: + mouse_pressed = event.pressed + if event.pressed == true: + browser.on_mouse_middle_down() + else: + browser.on_mouse_middle_up() + elif event is InputEventMouseMotion: + if mouse_pressed == true : + browser.on_mouse_left_down() + browser.on_mouse_moved(event.position.x, event.position.y) + pass + +# ============================================================================== +# Make the CEF browser reacts from keyboard events. +# ============================================================================== +func _input(event): + var browser = $CEF.get_node(browser1) + if browser == null: + $Panel/Label.set_text("Failed getting Godot node " + browser1) + return + if event is InputEventKey: + if event.unicode != 0: + browser.on_key_pressed(event.unicode, event.pressed, event.shift, event.alt, event.control) + else: + browser.on_key_pressed(event.scancode, event.pressed, event.shift, event.alt, event.control) + + pass + +# ============================================================================== +# Create a single briwser named "browser1" that is attached as child node to $CEF. +# ============================================================================== +func _ready(): + + # Configuration are: + # resource_path := {"artifacts", CEF_ARTIFACTS_FOLDER} + # resource_path := {"exported_artifacts", application_real_path()} + # {"incognito":false} + # {"cache_path", resource_path / "cache"} + # {"root_cache_path", resource_path / "cache"} + # {"browser_subprocess_path", resource_path / SUBPROCESS_NAME } + # {"log_file", resource_path / "debug.log"} + # {log_severity", "warning"} + # {"remote_debugging_port", 7777} + # {"exception_stack_size", 5} + # + # Configurate CEF. In incognito mode cache directories not used and in-memory + # caches are used instead and no data is persisted to disk. + # + # artifacts: allows path such as "build" or "res://build/". Note that "res://" + # will use ProjectSettings.globalize_path but exported projects don't support globalize_path: + # https://docs.godotengine.org/en/3.5/classes/class_projectsettings.html#class-projectsettings-method-globalize-path + var resource_path = "res://build/" + if !$CEF.initialize({"artifacts":resource_path, "incognito":true, "locale":"en-US"}): + push_error("Failed initializing CEF") + get_tree().quit() + pass + + var S = $Panel/TextureRect.get_size() + var browser = $CEF.create_browser("https://github.com/Lecrapouille/gdcef", browser1, S.x, S.y, {"javascript":true}) + browser.connect("page_loaded", self, "_on_page_loaded") + $Panel/TextureRect.texture = browser.get_texture() + +# ============================================================================== +# $CEF is periodically updated +# ============================================================================== +func _process(_delta): + pass diff --git a/addons/gdcef/demos/HelloCEF/CEF.tscn b/addons/gdcef/demos/HelloCEF/CEF.tscn new file mode 100644 index 0000000..5f588e9 --- /dev/null +++ b/addons/gdcef/demos/HelloCEF/CEF.tscn @@ -0,0 +1,77 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://CEF.gd" type="Script" id=1] +[ext_resource path="res://libs/gdcef.gdns" type="Script" id=2] + +[node name="GUI" type="Control"] +margin_right = 280.0 +margin_bottom = 180.0 +mouse_filter = 1 +script = ExtResource( 1 ) + +[node name="CEF" type="Node" parent="."] +script = ExtResource( 2 ) + +[node name="Panel" type="Panel" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 + +[node name="TextureRect" type="TextureRect" parent="Panel"] +anchor_top = 0.015 +anchor_bottom = 0.015 +margin_left = 5.0 +margin_top = 28.3 +margin_right = 273.0 +margin_bottom = 158.3 +mouse_filter = 0 +expand = true + +[node name="Label" type="Label" parent="Panel"] +margin_left = 4.0 +margin_top = 163.0 +margin_right = 81.0 +margin_bottom = 177.0 +mouse_filter = 0 +text = "Hello world!" + +[node name="Label2" type="Label" parent="Panel"] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 41.0 +margin_bottom = 21.0 +mouse_filter = 0 +text = "URL:" + +[node name="Home" type="Button" parent="Panel"] +margin_left = 208.0 +margin_top = 3.0 +margin_right = 259.0 +margin_bottom = 25.0 +text = "Home" + +[node name="Prev" type="Button" parent="Panel"] +margin_left = 186.0 +margin_top = 3.0 +margin_right = 206.0 +margin_bottom = 25.0 +text = "<" + +[node name="Next" type="Button" parent="Panel"] +margin_left = 259.0 +margin_top = 3.0 +margin_right = 279.0 +margin_bottom = 25.0 +text = ">" + +[node name="TextEdit" type="LineEdit" parent="Panel"] +margin_left = 43.0 +margin_top = 2.0 +margin_right = 185.0 +margin_bottom = 26.0 + +[connection signal="gui_input" from="Panel/TextureRect" to="." method="_on_TextureRect_gui_input"] +[connection signal="pressed" from="Panel/Home" to="." method="_on_Home_pressed"] +[connection signal="pressed" from="Panel/Prev" to="." method="_on_Prev_pressed"] +[connection signal="pressed" from="Panel/Next" to="." method="_on_Prev_pressed"] +[connection signal="pressed" from="Panel/Next" to="." method="_on_Next_pressed"] +[connection signal="text_changed" from="Panel/TextEdit" to="." method="_on_TextEdit_text_changed"] diff --git a/addons/gdcef/demos/2D/Control.gd b/addons/gdcef/demos/HelloCEF/Control.gd similarity index 100% rename from addons/gdcef/demos/2D/Control.gd rename to addons/gdcef/demos/HelloCEF/Control.gd diff --git a/addons/gdcef/demos/2D/Control.tscn b/addons/gdcef/demos/HelloCEF/Control.tscn similarity index 100% rename from addons/gdcef/demos/2D/Control.tscn rename to addons/gdcef/demos/HelloCEF/Control.tscn diff --git a/addons/gdcef/demos/HelloCEF/default_env.tres b/addons/gdcef/demos/HelloCEF/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/addons/gdcef/demos/HelloCEF/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/addons/gdcef/demos/HelloCEF/icon.png b/addons/gdcef/demos/HelloCEF/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..aeffb9176ea53a23c671fa7d3565be2ecda60f73 GIT binary patch literal 37441 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 literal 0 HcmV?d00001 diff --git a/addons/gdcef/demos/HelloCEF/libs/gdcef.gdnlib b/addons/gdcef/demos/HelloCEF/libs/gdcef.gdnlib new file mode 100644 index 0000000..5397e11 --- /dev/null +++ b/addons/gdcef/demos/HelloCEF/libs/gdcef.gdnlib @@ -0,0 +1,18 @@ +[general] + +singleton=false +load_once=true +symbol_prefix="godot_" +reloadable=false + +[entry] + +OSX.64="res://Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libgdcef.dylib" +Windows.64="res://build/libgdcef.dll" +X11.64="res://build/libgdcef.so" + +[dependencies] + +OSX.64=[ ] +Windows.64=[ "res://build/libcef.dll" ] +X11.64=[ "res://build/libcef.so" ] diff --git a/addons/gdcef/demos/HelloCEF/libs/gdcef.gdns b/addons/gdcef/demos/HelloCEF/libs/gdcef.gdns new file mode 100644 index 0000000..754b6f3 --- /dev/null +++ b/addons/gdcef/demos/HelloCEF/libs/gdcef.gdns @@ -0,0 +1,9 @@ +[gd_resource type="NativeScript" load_steps=2 format=2] + +[ext_resource path="res://libs/gdcef.gdnlib" type="GDNativeLibrary" id=1] + +[resource] +resource_name = "gdcef" +class_name = "GDCef" +library = ExtResource( 1 ) +script_class_name = "GDCef" diff --git a/addons/gdcef/demos/HelloCEF/project.godot b/addons/gdcef/demos/HelloCEF/project.godot new file mode 100644 index 0000000..4e6497b --- /dev/null +++ b/addons/gdcef/demos/HelloCEF/project.godot @@ -0,0 +1,33 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ { +"base": "", +"class": "GDCef", +"language": "NativeScript", +"path": "res://libs/gdcef.gdns" +} ] +_global_script_class_icons={ +"GDCef": "" +} + +[application] + +config/name="Hello CEF" +run/main_scene="res://Control.tscn" +config/icon="res://icon.png" + +[physics] + +common/enable_pause_aware_picking=true + +[rendering] + +environment/default_environment="res://default_env.tres" diff --git a/addons/gdcef/demos/README.md b/addons/gdcef/demos/README.md index 7242ab9..9cf35e3 100644 --- a/addons/gdcef/demos/README.md +++ b/addons/gdcef/demos/README.md @@ -43,15 +43,21 @@ directly (no prerequesites). ## Demos -## Demo 00: Multiple CEF browsers in 2D +## Demo 00: Hello CEF -A demo showing a 2D GUI with multiple CEF browser tabs. Only mouse and keyboard +A "Hello-world" demo showing a 2D GUI with multiple CEF browser tabs. Only mouse and keyboard events for the left browser are managed since a timer is loading URLs one by one for the right one. +![Screenshot](HelloCEF/icon.png) + +## Demo 01: CEF browser in 2D + +Basic browser with multiple tabs (work in progress). + ![Screenshot](2D/icon.png) -## Demo 01: Single CEF browser in 3D +## Demo 02: CEF browser in 3D A demo showing a 2D GUI with a single CEF browser tab. The tab is rotating inside a 3D scene. You can use your mouse and keyboard to surf on the web :)