[Projekt] xq's library

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Antworten
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

[Projekt] xq's library

Beitrag von xq »

Hey!

Ich habe jetzt endlich auch das ultimative NIH-Projekt angefangen, in dem ich mal alle möglichen Sachen, die ich für meine restlichen Spiele-Projekte so entwickelt habe, sammle:

xqlib

Das Ganze ist eine wilde Sammlung von C++17-Code mit einigen Komponenten, unter anderem:
  • xstd: Generische Helferklassen wie unique_id (nicht-arithmetischer Integer-Typ mit Type-Tag-Template für Typsicherheit) und dynamic_array (non-resizable Vector)
  • xlog: Einfacher logger nach stdout mit versch. log levels und ANSI-Einfärbung
  • xio: Handling für binäre Datenströme mit einfachen read/write-Funktionen.
  • xapp: grundlegende Anwendungsinitialisierung und Update mit SDL 2. Stellt Init-Code für OpenGL sowie SDL_Renderer bereit
  • xgl: OpenGL-Wrapper im RAII-Stil. Benötigt zwingendermaßen Direct State Access
  • xcs:Ein einfaches Entity-Component-System
  • xgraphics: Grafik-Klassen aufbauend auf xgl, im Moment debug_draw, shader_compiler, sprite_batch, texture_loader. Implementiert primär Helferklassen für Grafikprogrammierung, die die übliche Arbeit abnehmen.
  • xnet: POSIX-Socket-Abstraktion sowie ein einfacher HTTP-Server
Vieles davon ist auf KISS implementiert und besitzt grade die Features, die ich bisher benötigt habe. Daher ist das ganze auch nur mit clang/linux getestet worden, wird aber wohl irgendwann mind. partiell auch für Windows portiert. Die xqlib.pri bindet zudem auch gleich einige Libraries in das qmake-Environment ein: SDL 2, Guideline Support Libraryl, nothings stb, gl3w, curl, enet, imgui

Das ganze Projekt ist im Moment primär für mich als Basis-Framework gedacht, wenn sich aber zwei, drei Leute melden, wäre ich auch gewillt, in Teamwork das ganze zu optimieren und zu dokumentieren...
Ansonsten darf man sich natürlich auch gerne die Implementierung mopsen und für eigenen Kram verwenden!

Grüße
Felix

PS.: Beispielcode ist ja nie verkehrt, von daher ein paar Beispiele:

xapp:

Code: Alles auswählen

#include <xgl/all>
#include <xapp>

int main()
{
	if(not xapp::init(xapp::opengl)) // opengl oder sdl
		return 1;

	while(xapp::update())
	{
		xapp::clear();

		// custom render logic here

		xapp::present();
	}

	return xapp::quit();
}
xgl:

Code: Alles auswählen

// OpenGL-Buffer anlegen und mit Daten füllen leicht gemacht:
xgl::buffer vertexBuffer;
vertexBuffer.data({
	glm::vec3(1.0, 0.0, 0.0),
	glm::vec3(0.0, 1.0, 0.0),
	glm::vec3(0.0, 0.0, 1.0),
});
xnet:

Code: Alles auswählen

// HTTP-Server:
int main()
{
	xnet::http::server server;
	if(not server.bind(xnet::parse_ipv4("0.0.0.0", 8080)))
		return 1;

	std::cout << "ready.\n";

	while(true)
	{
		auto [ request, response ] = server.get_context();
		response.status_code = 200;

		auto stream = response.get_stream();

		stream.write_line("URL:    " + request.url);
		stream.write_line("Method: " + request.method);
		stream.write_line();

		stream.write_line("Headers:");
		for(auto const & header : request.headers)
		{
			stream.write_line(header.first + ": " + header.second);
		}
	}
	return 0;
}

Code: Alles auswählen

// tcp echo server 
int main()
{
	xnet::socket server(AF_INET, SOCK_STREAM);

	if(not server.bind(xnet::parse_ipv4("127.0.0.1", 8080)))
		return 1;

	if(not server.listen())
		return 2;

	while(true)
	{
		auto [ client, addr ] = *server.accept();
		std::cout << "connection from " << xnet::to_string(addr) << "!" << std::endl;
		while(true)
		{
			std::array<char, 128> data;
			auto const len = client.read(data.data(), data.size());
			if(len == 0)
				break;
			if(len < 0)
				return 3;
			client.write(data.data(), len);
		}
		std::cout << "client disconnected!" << std::endl;
	}
}
xcs:

Code: Alles auswählen

#include <xcs>

struct SomeComponent
{
	int a, b;
};
// erlaubt Erstellung der Komponente über Namen, zudem wird so verhindert, dass wild jeglicher Datentyp als Komponente verwendet werden kann.
XCS_REGISTER_COMPONENT(SomeComponent)

int main()
{
	xcs::universe scene;
	SomeSystem system(scene);

	xcs::entity ent = scene.create_entity();

	auto & c = xcs::add_component<SomeComponent>(ent);
	c.a = 10;
	c.b = 20;

	// Loop über alle Entitäten + Komponenten eines Komponententyps:
	for(auto [ entity, component ]: xcs::get_components<SomeComponent>(universe))
	{
		std::cout << entity.id << ", " << component.a << ", " << component.b << std::endl;
	}

	return 0;
}
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Psycho
Establishment
Beiträge: 156
Registriert: 16.09.2002, 14:23

Re: [Projekt] xq's library

Beitrag von Psycho »

Hurra, open source :D

Ich persönlich werde es wohl nicht nutzen, finde es aber schön, dass Du das Projekt hier teilst.
scheichs
Establishment
Beiträge: 845
Registriert: 28.07.2010, 20:18

Re: [Projekt] xq's library

Beitrag von scheichs »

Eine schöne nützliche Sammlung. Das Komponentensystem ist auch cool.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [Projekt] xq's library

Beitrag von xq »

Danke!

Es gibt ein neues, sehr praktisches Debug-"Modul": xgraphics::colors.
Es enthält alle von XKCD bestimmten Farbnamen als vec4(), unter anderem die schönen Farben puke, booger green und lipstick
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [Projekt] xq's library

Beitrag von xq »

Es geht voran, viele Features sind gewachsen und entstanden. Zwei der praktischen neuen Features: xutility::debug_camera sowie xio::save_struct bzw. xio::load_struct:

Code: Alles auswählen

xutility::debug_camera camera;

std::filesystem::path const camera_file("/tmp/xcamera.pos");
if(exists(camera_file))
	camera = xio::load_struct<xutility::debug_camera>(camera_file);

while(xapp::update())
{
	camera.look(delta(LOOK_HORIZONTAL), delta(LOOK_VERTICAL));

	float speed = 1.0f + delta(CAMERA_SPEEDUP);
	camera.move(speed * delta(MOVE_FORWARD) * xapp::dt(), speed * delta(MOVE_SIDEWARDS) * xapp::dt());

	if(hit(LOAD_POS) and exists(camera_file))
		camera = xio::load_struct<xutility::debug_camera>(camera_file);
	if(hit(SAVE_POS))
		xio::save_struct(camera_file, camera);

	xapp::clear(cornflower_blue);

	glClearDepth(1.0);
	glClear(GL_DEPTH_BUFFER_BIT);

	auto const projection = camera.get_projection_matrix(xapp::aspect());
	auto const view = camera.get_view_matrix();

	// Hier wird gerendert

	xapp::present();
}
delta() und hit() sind Funktionen aus xinput, welche Input-Werte abfragen
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Antworten