Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

124 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

GOLANG IMGUI PORTING EFFORTS

License will be MIT

A pure Go port of imgui as of github.com/ocornut/imgui commit 5ee40c8d34bea3009cf462ec963225bd22067e5e
(the remaining IMGUI code that needs to be ported from this commit are included in the repository)

It is important to me to have an Imgui package in pure Go, without any C code. Ideally I would like the entire functionality of Imgui ported, including all current widgets and features.

The end goal is to have the complete IMGUI demo window running natively in Go (so far demo window is only partially implemented).

Current Status

The example directory contains a backend for glfw/opengl3 and a buildable program.

go get && go mod download && go build with Go 1.16+ should build it just fine.

Besides the demo window, the port is technically complete but I am sure to have made mistakes during the port which have introduced bugs here and there.

The Quick Brown Fox Jumps Over The Lazy Dog

How to debug bugs

  1. Clone imgui and checkout the commit hash specified at the top of this Readme,
  2. Create an identical program in Go and C++
  3. Either use a debugger and/or insert print lines and figure out how, why and when values are diverging.

API Differences

I'm trying to stick as close to the C++ API as possible at the moment, at some stage, I think it would be nice to clean up the API to make it more idiomatic for Go

Helpful tips for porting C++ to Go

I have stumbled upon a number of roadblocks, and I have included a list of things to keep in mind when porting from C++ to Go.

  1. Go has a stronger type system then C++, therefore any integer conversions need to be explicit

     var x uint16
    var y int32
    y = int32(x) //annoying but required for porting
    
  2. A lot of the code I have seen, passes arrays by pointer, in Go this can generally be replaced by a slice.

     STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);
    //becomes
    func GetNumberOfFonts(data []byte) int {
    
  3. Sometimes these C++ array pointers are incremented, I find this to be a very
    strange pattern but it can be replicated in Go by using a slice operation. Keep in mind that the solution below only works for pointer increments, pointer decrements require a different approach (passing an additional index offset).

     //C++
    stbtt_uint8 *points;
    stbtt_uint8 flags = *points++; //Go var points []byte
    var flags byte = points[0] //get the first byte of the
    points = points[1:] //slice operation, moves the pointer forward by one byte
    slice
    
  4. Go doesn't have struct/array constants, but you can just use a variable to hold the value.

     //C++
    const ImVec2 zero = ImVec2(0,0);
    //Go
    var zero = ImVec2{0,0}
    
  5. Go doesn't have static, so the porting of the imgui debug window is painful, perhaps it can be broken up into seperate functions? I don't know.

  6. If a C++ function uses a *void pointer, this can be replaced with a Go interface{} type, any value can be assigned to it.

     //C++
    void *userdata;
    //Go
    var userdata interface{}
    
  7. Imgui appears to support callbacks of some kind, they are normally passed as a struct, I am not too sure how this works in C++, but Go has function types and closures that can be used instead.

     //C++
    typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data)
    //Go
    type ImGuiSizeCallback func(data *ImGuiSizeCallbackData)
    
  8. Go doesn't have ternary operator.

     //C++
    int x = a ? b : c;
    //Go
    var x int32
    if a {
    x = b
    } else {
    x = c
    }
    
  9. Go is garbage collected, so the ImGui/STB memory management can be removed. Can just use builtin new and make for allocations.

  10. I found it useful to move cpp files into the different packages and go through them function-by-function and delete them as I go to track porting progress. It's nice to see the lines of code in the file you are working on slowly go down as you port them.

About

Buggy Pure Go Port of Dear Imgui

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages