meemknight 2 tahun lalu
induk
melakukan
0837af7f9c

+ 80 - 36
Pika/pluggins/pluggins/sushiViewer/sushiViewer.cpp

@@ -19,20 +19,12 @@ bool SushiViewer::create(RequestedContainerInfo &requestedInfo, pika::StaticStri
 {
 	renderer.create(requestedInfo.requestedFBO.fbo);
 
-
-	sushi::SushiUiElement element;
-	element.background.color = Colors_Magenta;
-	element.transform.absoluteTransformPixelSize({100,100,200,100});
-	element.id = 2;
-
-	sushiContext.root.allUiElements.push_back(element);
-
 	return true;
 }
 
-void displaySushiBackgroundImgui(::sushi::Background &e)
+void SushiViewer::displaySushiBackgroundImgui(::sushi::Background &e, int id)
 {
-	if (ImGui::BeginChildFrame(11, {0, 100}, true))
+	if (ImGui::BeginChildFrame(id, {0, 100}, true))
 	{
 		ImGui::Text("Background element editor");
 
@@ -43,52 +35,98 @@ void displaySushiBackgroundImgui(::sushi::Background &e)
 	ImGui::EndChildFrame();
 }
 
-void displaySushiTransformImgui(::sushi::Transform &e)
+void SushiViewer::displaySushiTransformImgui(::sushi::Transform & e, glm::vec4 parent, int id)
 {
-	if (ImGui::BeginChildFrame(12, {0, 100}, true))
+	if (ImGui::BeginChildFrame(id, {0, 200}, true))
 	{
+		auto copy = e;
+
 		ImGui::Text("Transform element editor");
 
+		ImGui::Combo("Pos type", &copy.placementType, "Relative\0Absolute\0");
+		ImGui::Combo("Size type", &copy.dimensionsType, "Percentage\0Absolute\0");
+
+		ImGui::DragFloat2("Pos", &e.pos[0]);
+		ImGui::DragFloat2("Size", &e.size[0]);
 
+		e.changeSettings(copy, parent);
 
 	}
 	ImGui::EndChildFrame();
 }
 
-void displaySushiUiElementImgui(::sushi::SushiUiElement &e)
+void SushiViewer::displaySushiUiElementImgui(::sushi::SushiUiElement &e, glm::vec4 parent, int id)
 {
-	if (ImGui::BeginChildFrame(13, {0, 500}, true))
+	if (ImGui::BeginChildFrame(id, {0, 500}, true))
 	{
 		ImGui::Text("Ui element editor: %s, id: %u", e.name, e.id);
 
-		displaySushiTransformImgui(e.transform);
+		displaySushiTransformImgui(e.transform, parent, id + 1000);
 		ImGui::Separator();
-		displaySushiBackgroundImgui(e.background);
+		displaySushiBackgroundImgui(e.background, id + 500);
 
 	}
 	ImGui::EndChildFrame();
 }
 
-void displaySushiParentElementImgui(::sushi::SushiParent &e)
+void SushiViewer::displaySushiParentElementImgui(::sushi::SushiParent &e, glm::vec4 parent)
 {
-	if (ImGui::BeginChildFrame(14, {0, 700}, true))
+	if (ImGui::BeginChildFrame(2, {0, 700}, true))
 	{
 		ImGui::Text("Parent editor: %s, id: %u", e.name, e.id);
 
-		displaySushiTransformImgui(e.transform);
+		displaySushiTransformImgui(e.transform, parent, 3);
+		ImGui::Separator();
+		displaySushiBackgroundImgui(e.background, 4);
 		ImGui::Separator();
-		displaySushiBackgroundImgui(e.background);
+
+		sushi::Transform transform;
+		transform.relativeTransformPixelSize({10, 10, 100, 100});
+
+		if (ImGui::Button("Add element"))
+		{
+			sushiContext.addElement(e, "New Element", transform, sushi::Background());
+		}
+
+		if (ImGui::Button("Add parent"))
+		{
+			sushiContext.addParent(e, "New Parent", transform, sushi::Background({0.5,0.2,0.2,1.f}));
+		}
 
 		ImGui::Separator();
+		int id = 30;
 		for (auto &i : e.allUiElements)
 		{
-			displaySushiUiElementImgui(i);
+			ImGui::PushID(id++);
+			displaySushiUiElementImgui(i, e.outData.absTransform, id+500);
+			ImGui::PopID();
 		}
 
 	}
 	ImGui::EndChildFrame();
 }
 
+//takes the id of a parent and returns his parent
+sushi::SushiParent *findParentOfParent(sushi::SushiParent &parent, unsigned int id)
+{
+
+	for (auto &i : parent.subElements)
+	{
+		if (i.id == id)
+		{
+			return &parent;
+		}
+	}
+
+	for (auto &i : parent.subElements)
+	{
+		auto rez = findParentOfParent(i, id);
+		if (rez) { return rez; }
+	}
+
+	return 0;
+}
+
 void visit(sushi::SushiParent &parent, unsigned int id, sushi::SushiUiElement* &selectedElement,
 sushi::SushiParent* &selectedParent
 	)
@@ -112,6 +150,7 @@ sushi::SushiParent* &selectedParent
 	for (auto &i : parent.subElements)
 	{
 		visit(i, id, selectedElement, selectedParent);
+		if (selectedElement || selectedParent) { break; }
 	}
 
 	return;
@@ -148,6 +187,7 @@ void visitSelect(sushi::SushiParent &parent, unsigned int &id, sushi::SushiUiEle
 	for (auto &i : parent.subElements)
 	{
 		visitSelect(i, id, selectedElement, selectedParent, mousePos);
+		if (selectedElement || selectedParent) { break; }
 	}
 
 	return;
@@ -175,7 +215,6 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 	}
 #pragma endregion
 
-	
 
 	sushi::SushiUiElement *selectedElement = 0;
 	sushi::SushiParent *selectedParent = 0;
@@ -208,21 +247,27 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 		//img.elementSelected = glm::clamp(img.elementSelected, -1, (int)(elementsSize - 1));
 		//
 
-		if (selectedElement)
+
+		if (selectedElement && selectedParent)
 		{
-			if (selectedParent)
+			if (ImGui::Button("Select parent"))
 			{
-				if (ImGui::Button("Select parent"))
-				{
-					img.elementId = selectedParent->id;
-				}
+				img.elementId = selectedParent->id;
 			}
 
-			displaySushiUiElementImgui(*selectedElement);
+			displaySushiUiElementImgui(*selectedElement, selectedParent->outData.absTransform, 100);
 		}else
 		if (selectedParent)
 		{
-			displaySushiParentElementImgui(*selectedParent);
+			auto parentOfParentId = findParentOfParent(sushiContext.root, img.elementId);
+			glm::vec4 parentRect = {0, 0, renderer.windowW, renderer.windowH};
+
+			if (parentOfParentId)
+			{
+				parentRect = parentOfParentId->outData.absTransform;
+			}
+
+			displaySushiParentElementImgui(*selectedParent, parentRect);
 		}
 
 
@@ -231,6 +276,11 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 	ImGui::End();
 
 
+	if (selectedElement)
+	{
+		renderer.renderRectangleOutline(selectedElement->outData.absTransform,
+			{1,0,0,0.5}, 4.0f);
+	}else
 	if (selectedParent)
 	{
 		//todo add alias render box
@@ -238,12 +288,6 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 			{1,0,0,0.5}, 4.0f);
 	}
 
-	if (selectedElement)
-	{
-		renderer.renderRectangleOutline(selectedElement->outData.absTransform,
-			{1,0,0,0.5}, 4.0f);
-	}
-
 
 	renderer.flush();
 

+ 7 - 0
Pika/pluggins/pluggins/sushiViewer/sushiViewer.h

@@ -30,5 +30,12 @@ struct SushiViewer: public Container
 
 	}img;
 
+	void displaySushiParentElementImgui(::sushi::SushiParent &e, glm::vec4 parent);
+
+	void displaySushiUiElementImgui(::sushi::SushiUiElement &e, glm::vec4 parent, int id);
+
+	void displaySushiTransformImgui(::sushi::Transform &e, glm::vec4 parent, int id);
+
+	void displaySushiBackgroundImgui(::sushi::Background &e, int id);
 };
 

+ 2 - 2
Pika/resources/logs.txt

@@ -1,2 +1,2 @@
-#2023-09-06 16:23:07: Created container: SushiViewer
-#2023-09-06 16:23:14: Destroyed continer: SushiViewer #1
+#2023-09-06 18:05:02: Created container: SushiViewer
+#2023-09-06 18:06:51: Destroyed continer: SushiViewer #1

+ 13 - 0
Pika/thirdparty/sushi/include/sushi/sushi.h

@@ -48,6 +48,7 @@ namespace sushi
 		
 		OutData outData;
 
+
 	};
 
 	//this is a sushi context. Holds all the windows and manages stuff
@@ -63,6 +64,18 @@ namespace sushi
 		void update(gl2d::Renderer2D &renderer, 
 			sushi::SushiInput &input);
 
+		void addElement(
+			SushiParent &parent,
+			const char *name,
+			Transform &transform,
+			Background &background);
+
+		void addParent(
+			SushiParent &parent,
+			const char *name,
+			Transform &transform,
+			Background &background);
+
 	};
 
 	

+ 9 - 2
Pika/thirdparty/sushi/include/sushi/sushiPrimitives.h

@@ -11,13 +11,13 @@ namespace sushi
 	{
 		enum
 		{
-			RelativeTransform,
+			RelativeTransform = 0,
 			AbsoluteTransform,
 		};
 
 		enum
 		{
-			DimensionsPercentage,
+			DimensionsPercentage = 0,
 			DimensionsPixelsAbsolute,
 		};
 
@@ -39,6 +39,13 @@ namespace sushi
 		void relativeTransformDimensionsPercentage(glm::vec4 dimensions);
 
 		glm::vec4 applyTransform(glm::vec4 parent);
+
+		void changeSettings(Transform t, glm::vec4 parent)
+		{
+			//todo
+			this->placementType = t.placementType;
+			this->dimensionsType = t.dimensionsType;
+		}
 	};
 
 	Transform defaultTransform();

+ 32 - 2
Pika/thirdparty/sushi/src/sushi.cpp

@@ -3,13 +3,44 @@
 namespace sushi
 {
 
+	void SushyContext::addElement(
+		SushiParent &parent,
+		const char *name,
+		Transform &transform,
+		Background &background)
+	{
+
+		sushi::SushiUiElement element;
+		element.id = currentIdCounter++;
+		element.background = background;
+		element.transform = transform;
+		std::strncpy(element.name, name, sizeof(element.name) - 1);
+		
+		parent.allUiElements.push_back(element);
+	}
+
+	void SushyContext::addParent(
+		SushiParent &parent,
+		const char *name,
+		Transform &transform,
+		Background &background)
+	{
+
+		sushi::SushiParent newParent;
+		newParent.id = currentIdCounter++;
+		newParent.background = background;
+		newParent.transform = transform;
+		std::strncpy(newParent.name, name, sizeof(newParent.name) - 1);
+
+		parent.subElements.push_back(newParent);
+	}
+
 	void SushyContext::createBasicSchene(int baseId, const char *name)
 	{
 		*this = {};
 		root.id = baseId;
 		currentIdCounter = baseId + 1;
 		std::strncpy(root.name, name, sizeof(root.name)-1);
-
 	
 	}
 
@@ -39,7 +70,6 @@ namespace sushi
 		glm::vec4 drawRegion = transform.applyTransform(parentTransform);
 		outData.set(drawRegion);
 
-
 		//backgrouund
 		background.render(renderer, drawRegion);