Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementing viewport functionality into ImGui.NET #140

Open
wants to merge 29 commits into
base: viewport
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
78b6fd6
Fixed switched mouse input
Jan 3, 2019
571f797
Fix issue with InputText(Multiline) manual overloads which could over…
mellinoe Jan 13, 2019
c4842e4
Bump version to 1.66.1.
mellinoe Jan 13, 2019
7f3739a
Update to 1.67.
mellinoe Jan 15, 2019
0f32fae
fixes a bug with MonoGame and FNA when creating a texture at runtime
prime31 Feb 13, 2019
3a62f6b
update link in csproj file
prime31 Feb 13, 2019
78fe032
cleanup
prime31 Feb 13, 2019
8e3caa1
Fix FNA input for text
prime31 Feb 13, 2019
1743198
Fix native constructor function imports
mellinoe Feb 25, 2019
4588142
Generated PInvokes for "_destroy" functions .
mellinoe Feb 25, 2019
dcb9b89
Add build targets for mono and legacy MSBuild (pre-PackageReference).
mellinoe Mar 13, 2019
4ef0abb
Update to 1.68.
mellinoe Mar 13, 2019
580d552
Merge branch 'mono-build-targets'
mellinoe Mar 13, 2019
34a0848
Update to v1.69.
mellinoe Apr 2, 2019
489f847
Update to v1.70.
amerkoleci May 8, 2019
448f22d
Handle new default value in the code generator.
mellinoe May 9, 2019
8e34c98
Download 1.70 binaries.
mellinoe May 9, 2019
88ca3dc
Update to last 1.71
amerkoleci Jun 17, 2019
cd5c026
Add support for parameters having variant types as defined in variant…
giawa Jun 18, 2019
5afed42
Add example variants.json that adds IntPtr* as a parameter variant fo…
giawa Jun 18, 2019
8be7644
Modify SampleProgram to use 'safe' version of GetTexDataAsRGBA32, whi…
giawa Jun 18, 2019
d62cb5f
Process the variants into a dictionary and then mark them as used as …
giawa Jun 18, 2019
84ec6ed
Update native binaries to 1.71.
mellinoe Jul 17, 2019
88836f5
Merge remote-tracking branch 'giawa/feature/type-variants-sep-json' i…
mellinoe Jul 17, 2019
5e9d6be
Misc project cleanup
mellinoe Jul 17, 2019
35aabdc
Bump to 1.72b (NuGet version 1.72.0).
mellinoe Sep 22, 2019
96e786d
docking branch version of dear imgui using cimgui
Sep 30, 2019
dea364d
implement viewport functionality
Oct 18, 2019
5b7352c
minor cleanup
Oct 18, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -259,4 +259,7 @@ Session.vim
.idea

# download dir
deps/
deps/

# VS Launch
launchSettings.json
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,5 @@ https://github.com/ocornut/imgui

See the [official screenshot thread](https://github.com/ocornut/imgui/issues/123) for examples of many different kinds of interfaces created with Dear ImGui.

https://github.com/Extrawurst/cimgui
https://github.com/cimgui/cimgui
> This is a thin c-api wrapper for the excellent C++ intermediate gui imgui. This library is intended as a intermediate layer to be able to use imgui from other languages that can interface with C .
Binary file modified deps/cimgui/linux-x64/cimgui.so
Binary file not shown.
Binary file modified deps/cimgui/osx-x64/cimgui.dylib
Binary file not shown.
Binary file modified deps/cimgui/win-x64/cimgui.dll
Binary file not shown.
Binary file modified deps/cimgui/win-x86/cimgui.dll
Binary file not shown.
3 changes: 2 additions & 1 deletion src/CodeGenerator/CodeGenerator.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
Expand All @@ -8,6 +8,7 @@
<ItemGroup>
<Content Include="structs_and_enums.json" CopyToOutputDirectory="PreserveNewest" />
<Content Include="definitions.json" CopyToOutputDirectory="PreserveNewest" />
<Content Include="variants.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

<ItemGroup>
Expand Down
189 changes: 176 additions & 13 deletions src/CodeGenerator/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace CodeGenerator
{
class Program
internal static class Program
{
private static readonly Dictionary<string, string> s_wellKnownTypes = new Dictionary<string, string>()
{
Expand Down Expand Up @@ -56,7 +56,7 @@ class Program
"ImVector",
"ImVec2",
"ImVec4",
"Pair",
"ImGuiStoragePair",
};

private static readonly Dictionary<string, string> s_wellKnownDefaultValues = new Dictionary<string, string>()
Expand All @@ -70,8 +70,9 @@ class Program
{ "ImVec2(0,1)", "new Vector2(0, 1)" },
{ "ImVec4(0,0,0,0)", "new Vector4()" },
{ "ImVec4(1,1,1,1)", "new Vector4(1, 1, 1, 1)" },
{ "ImDrawCornerFlags_All", "(int)ImDrawCornerFlags.All" },
{ "ImDrawCornerFlags_All", "ImDrawCornerFlags.All" },
{ "FLT_MAX", "float.MaxValue" },
{ "(((ImU32)(255)<<24)|((ImU32)(255)<<16)|((ImU32)(255)<<8)|((ImU32)(255)<<0))", "0xFFFFFFFF" }
};

private static readonly Dictionary<string, string> s_identifierReplacements = new Dictionary<string, string>()
Expand Down Expand Up @@ -129,6 +130,27 @@ static void Main(string[] args)
functionsJson = JObject.Load(jr);
}

JObject variantsJson = null;
if (File.Exists(Path.Combine(AppContext.BaseDirectory, "variants.json")))
{
using (StreamReader fs = File.OpenText(Path.Combine(AppContext.BaseDirectory, "variants.json")))
using (JsonTextReader jr = new JsonTextReader(fs))
{
variantsJson = JObject.Load(jr);
}
}

Dictionary<string, MethodVariant> variants = new Dictionary<string, MethodVariant>();
foreach (var jt in variantsJson.Children())
{
JProperty jp = (JProperty)jt;
ParameterVariant[] methodVariants = jp.Values().Select(jv =>
{
return new ParameterVariant(jv["name"].ToString(), jv["type"].ToString(), jv["variants"].Select(s => s.ToString()).ToArray());
}).ToArray();
variants.Add(jp.Name, new MethodVariant(jp.Name, methodVariants));
}

EnumDefinition[] enums = typesJson["enums"].Select(jt =>
{
JProperty jp = (JProperty)jt;
Expand Down Expand Up @@ -168,6 +190,10 @@ static void Main(string[] args)
string ov_cimguiname = val["ov_cimguiname"]?.ToString();
string cimguiname = val["cimguiname"].ToString();
string friendlyName = val["funcname"]?.ToString();
if (cimguiname.EndsWith("_destroy"))
{
friendlyName = "Destroy";
}
if (friendlyName == null) { return null; }

string exportedName = ov_cimguiname;
Expand All @@ -190,11 +216,20 @@ static void Main(string[] args)

List<TypeReference> parameters = new List<TypeReference>();

// find any variants that can be applied to the parameters of this method based on the method name
MethodVariant methodVariants = null;
variants.TryGetValue(jp.Name, out methodVariants);

foreach (JToken p in val["argsT"])
{
string pType = p["type"].ToString();
string pName = p["name"].ToString();
parameters.Add(new TypeReference(pName, pType, enums));

// if there are possible variants for this method then try to match them based on the parameter name and expected type
ParameterVariant matchingVariant = methodVariants?.Parameters.Where(pv => pv.Name == pName && pv.OriginalType == pType).FirstOrDefault() ?? null;
if (matchingVariant != null) matchingVariant.Used = true;

parameters.Add(new TypeReference(pName, pType, enums, matchingVariant?.VariantTypes));
}

Dictionary<string, string> defaultValues = new Dictionary<string, string>();
Expand All @@ -207,6 +242,12 @@ static void Main(string[] args)
string comment = null;

string structName = val["stname"].ToString();
bool isConstructor = val.Value<bool>("constructor");
bool isDestructor = val.Value<bool>("destructor");
if (isConstructor)
{
returnType = structName + "*";
}

return new OverloadDefinition(
exportedName,
Expand All @@ -216,10 +257,11 @@ static void Main(string[] args)
returnType,
structName,
comment,
enums);
isConstructor,
isDestructor);
}).Where(od => od != null).ToArray();

return new FunctionDefinition(name, overloads);
return new FunctionDefinition(name, overloads, enums);
}).OrderBy(fd => fd.Name).ToArray();

foreach (EnumDefinition ed in enums)
Expand Down Expand Up @@ -361,8 +403,10 @@ static void Main(string[] args)
continue;
}

if (overload.FriendlyName == overload.StructName)
if (overload.IsConstructor)
{
// TODO: Emit a static function on the type that invokes the native constructor.
// Also, add a "Dispose" function or similar.
continue;
}

Expand Down Expand Up @@ -423,6 +467,7 @@ static void Main(string[] args)
{
string exportedName = overload.ExportedName;
if (exportedName.Contains("~")) { continue; }
if (exportedName.Contains("ImVector_")) { continue; }
if (overload.Parameters.Any(tr => tr.Type.Contains('('))) { continue; } // TODO: Parse function pointer parameters.

string ret = GetTypeString(overload.ReturnType, false);
Expand Down Expand Up @@ -530,6 +575,14 @@ static void Main(string[] args)
writer.PopBlock();
writer.PopBlock();
}

foreach (var method in variants)
{
foreach (var variant in method.Value.Parameters)
{
if (!variant.Used) Console.WriteLine($"Error: Variants targetting parameter {variant.Name} with type {variant.OriginalType} could not be applied to method {method.Key}.");
}
}
}

private static bool IsStringFieldName(string name)
Expand Down Expand Up @@ -636,7 +689,7 @@ private static void EmitOverload(
preCallLines.Add($" }}");
preCallLines.Add($" int {nativeArgName}_offset = Util.GetUtf8({textToEncode}, {nativeArgName}, {correctedIdentifier}_byteCount);");
preCallLines.Add($" {nativeArgName}[{nativeArgName}_offset] = 0;");

if (!hasDefault)
{
preCallLines.Add("}");
Expand Down Expand Up @@ -948,6 +1001,38 @@ private static string CorrectIdentifier(string identifier)
}
}

class MethodVariant
{
public string Name { get; }

public ParameterVariant[] Parameters { get; }

public MethodVariant(string name, ParameterVariant[] parameters)
{
Name = name;
Parameters = parameters;
}
}

class ParameterVariant
{
public string Name { get; }

public string OriginalType { get; }

public string[] VariantTypes { get; }

public bool Used { get; set; }

public ParameterVariant(string name, string originalType, string[] variantTypes)
{
Name = name;
OriginalType = originalType;
VariantTypes = variantTypes;
Used = false;
}
}

class EnumDefinition
{
private readonly Dictionary<string, string> _sanitizedNames;
Expand Down Expand Up @@ -1034,11 +1119,18 @@ class TypeReference
public string TemplateType { get; }
public int ArraySize { get; }
public bool IsFunctionPointer { get; }
public string[] TypeVariants { get; }

public TypeReference(string name, string type, EnumDefinition[] enums)
: this(name, type, null, enums) { }
: this(name, type, null, enums, null) { }

public TypeReference(string name, string type, EnumDefinition[] enums, string[] typeVariants)
: this(name, type, null, enums, typeVariants) { }

public TypeReference(string name, string type, string templateType, EnumDefinition[] enums)
: this(name, type, templateType, enums, null) { }

public TypeReference(string name, string type, string templateType, EnumDefinition[] enums, string[] typeVariants)
{
Name = name;
Type = type.Replace("const", string.Empty).Trim();
Expand Down Expand Up @@ -1067,6 +1159,8 @@ public TypeReference(string name, string type, string templateType, EnumDefiniti
}

IsFunctionPointer = Type.IndexOf('(') != -1;

TypeVariants = typeVariants;
}

private int ParseSizeString(string sizePart, EnumDefinition[] enums)
Expand Down Expand Up @@ -1102,17 +1196,76 @@ private int ParseSizeString(string sizePart, EnumDefinition[] enums)

return ret;
}

public TypeReference WithVariant(int variantIndex, EnumDefinition[] enums)
{
if (variantIndex == 0) return this;
else return new TypeReference(Name, TypeVariants[variantIndex - 1], TemplateType, enums);
}
}

class FunctionDefinition
{
public string Name { get; }
public OverloadDefinition[] Overloads { get; }

public FunctionDefinition(string name, OverloadDefinition[] overloads)
public FunctionDefinition(string name, OverloadDefinition[] overloads, EnumDefinition[] enums)
{
Name = name;
Overloads = overloads;
Overloads = ExpandOverloadVariants(overloads, enums);
}

private OverloadDefinition[] ExpandOverloadVariants(OverloadDefinition[] overloads, EnumDefinition[] enums)
{
List<OverloadDefinition> newDefinitions = new List<OverloadDefinition>();

foreach (OverloadDefinition overload in overloads)
{
bool hasVariants = false;
int[] variantCounts = new int[overload.Parameters.Length];

for (int i = 0; i < overload.Parameters.Length; i++)
{
if (overload.Parameters[i].TypeVariants != null)
{
hasVariants = true;
variantCounts[i] = overload.Parameters[i].TypeVariants.Length + 1;
}
else
{
variantCounts[i] = 1;
}
}

if (hasVariants)
{
int totalVariants = variantCounts[0];
for (int i = 1; i < variantCounts.Length; i++) totalVariants *= variantCounts[i];

for (int i = 0; i < totalVariants; i++)
{
TypeReference[] parameters = new TypeReference[overload.Parameters.Length];
int div = 1;

for (int j = 0; j < parameters.Length; j++)
{
int k = (i / div) % variantCounts[j];

parameters[j] = overload.Parameters[j].WithVariant(k, enums);

if (j > 0) div *= variantCounts[j];
}

newDefinitions.Add(overload.WithParameters(parameters));
}
}
else
{
newDefinitions.Add(overload);
}
}

return newDefinitions.ToArray();
}
}

Expand All @@ -1126,6 +1279,8 @@ class OverloadDefinition
public string StructName { get; }
public bool IsMemberFunction { get; }
public string Comment { get; }
public bool IsConstructor { get; }
public bool IsDestructor { get; }

public OverloadDefinition(
string exportedName,
Expand All @@ -1135,16 +1290,24 @@ public OverloadDefinition(
string returnType,
string structName,
string comment,
EnumDefinition[] enums)
bool isConstructor,
bool isDestructor)
{
ExportedName = exportedName;
FriendlyName = friendlyName;
Parameters = parameters;
DefaultValues = defaultValues;
ReturnType = returnType.Replace("const", string.Empty).Replace("inline", string.Empty).Trim();
StructName = structName;
IsMemberFunction = structName != "ImGui";
IsMemberFunction = !string.IsNullOrEmpty(structName);
Comment = comment;
IsConstructor = isConstructor;
IsDestructor = isDestructor;
}

public OverloadDefinition WithParameters(TypeReference[] parameters)
{
return new OverloadDefinition(ExportedName, FriendlyName, parameters, DefaultValues, ReturnType, StructName, Comment, IsConstructor, IsDestructor);
}
}

Expand Down
8 changes: 0 additions & 8 deletions src/CodeGenerator/Properties/launchSettings.json

This file was deleted.

Loading