Initial commit
it works!!
This commit is contained in:
		
						commit
						3fe4a536c5
					
				
							
								
								
									
										76
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
# This file is used to ignore files which are generated
 | 
			
		||||
# ----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
*~
 | 
			
		||||
*.autosave
 | 
			
		||||
*.a
 | 
			
		||||
*.core
 | 
			
		||||
*.moc
 | 
			
		||||
*.o
 | 
			
		||||
*.obj
 | 
			
		||||
*.orig
 | 
			
		||||
*.rej
 | 
			
		||||
*.so
 | 
			
		||||
*.so.*
 | 
			
		||||
*_pch.h.cpp
 | 
			
		||||
*_resource.rc
 | 
			
		||||
*.qm
 | 
			
		||||
.#*
 | 
			
		||||
*.*#
 | 
			
		||||
core
 | 
			
		||||
!core/
 | 
			
		||||
tags
 | 
			
		||||
.DS_Store
 | 
			
		||||
.directory
 | 
			
		||||
*.debug
 | 
			
		||||
Makefile*
 | 
			
		||||
*.prl
 | 
			
		||||
*.app
 | 
			
		||||
moc_*.cpp
 | 
			
		||||
ui_*.h
 | 
			
		||||
qrc_*.cpp
 | 
			
		||||
Thumbs.db
 | 
			
		||||
*.res
 | 
			
		||||
*.rc
 | 
			
		||||
/.qmake.cache
 | 
			
		||||
/.qmake.stash
 | 
			
		||||
 | 
			
		||||
# qtcreator generated files
 | 
			
		||||
*.pro.user*
 | 
			
		||||
CMakeLists.txt.user*
 | 
			
		||||
 | 
			
		||||
# xemacs temporary files
 | 
			
		||||
*.flc
 | 
			
		||||
 | 
			
		||||
# Vim temporary files
 | 
			
		||||
.*.swp
 | 
			
		||||
 | 
			
		||||
# Visual Studio generated files
 | 
			
		||||
*.ib_pdb_index
 | 
			
		||||
*.idb
 | 
			
		||||
*.ilk
 | 
			
		||||
*.pdb
 | 
			
		||||
*.sln
 | 
			
		||||
*.suo
 | 
			
		||||
*.vcproj
 | 
			
		||||
*vcproj.*.*.user
 | 
			
		||||
*.ncb
 | 
			
		||||
*.sdf
 | 
			
		||||
*.opensdf
 | 
			
		||||
*.vcxproj
 | 
			
		||||
*vcxproj.*
 | 
			
		||||
 | 
			
		||||
# MinGW generated files
 | 
			
		||||
*.Debug
 | 
			
		||||
*.Release
 | 
			
		||||
 | 
			
		||||
# Python byte code
 | 
			
		||||
*.pyc
 | 
			
		||||
 | 
			
		||||
# Binaries
 | 
			
		||||
# --------
 | 
			
		||||
*.dll
 | 
			
		||||
*.exe
 | 
			
		||||
 | 
			
		||||
# build dir
 | 
			
		||||
build/
 | 
			
		||||
							
								
								
									
										44
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
cmake_minimum_required(VERSION 3.16)
 | 
			
		||||
 | 
			
		||||
project(texcrafting VERSION 0.1 LANGUAGES CXX)
 | 
			
		||||
 | 
			
		||||
set(CMAKE_AUTOMOC ON)
 | 
			
		||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
 | 
			
		||||
 | 
			
		||||
find_package(Qt6 6.2 REQUIRED COMPONENTS Quick QuickControls2)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
qt_add_executable(apptexcrafting
 | 
			
		||||
    main.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
qt_add_qml_module(apptexcrafting
 | 
			
		||||
    URI texcrafting
 | 
			
		||||
    VERSION 1.0
 | 
			
		||||
    QML_FILES
 | 
			
		||||
        Main.qml
 | 
			
		||||
        TexSlot.qml
 | 
			
		||||
        SOURCES texturecrafter.h texturecrafter.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
 | 
			
		||||
# If you are developing for iOS or macOS you should consider setting an
 | 
			
		||||
# explicit, fixed bundle identifier manually though.
 | 
			
		||||
set_target_properties(apptexcrafting PROPERTIES
 | 
			
		||||
#    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.apptexcrafting
 | 
			
		||||
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
 | 
			
		||||
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
 | 
			
		||||
    MACOSX_BUNDLE TRUE
 | 
			
		||||
    WIN32_EXECUTABLE TRUE
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
target_link_libraries(apptexcrafting
 | 
			
		||||
    PRIVATE Qt6::Quick
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
include(GNUInstallDirs)
 | 
			
		||||
install(TARGETS apptexcrafting
 | 
			
		||||
    BUNDLE DESTINATION .
 | 
			
		||||
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
 | 
			
		||||
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										73
									
								
								Main.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								Main.qml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
import QtQuick
 | 
			
		||||
import QtQuick.Layouts
 | 
			
		||||
import QtQuick.Controls
 | 
			
		||||
 | 
			
		||||
import texcrafting
 | 
			
		||||
 | 
			
		||||
ApplicationWindow {
 | 
			
		||||
    width: 640
 | 
			
		||||
    height: 480
 | 
			
		||||
    visible: true
 | 
			
		||||
    title: qsTr("Hello World")
 | 
			
		||||
 | 
			
		||||
    TextureCrafter {
 | 
			
		||||
        id: crafter
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RowLayout {
 | 
			
		||||
        anchors.fill: parent
 | 
			
		||||
 | 
			
		||||
        ColumnLayout {
 | 
			
		||||
            Layout.fillWidth: true
 | 
			
		||||
 | 
			
		||||
            Layout.alignment: Qt.AlignHCenter
 | 
			
		||||
 | 
			
		||||
            TexSlot {
 | 
			
		||||
                id: texSlotR
 | 
			
		||||
 | 
			
		||||
                rectColor: "red"
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            TexSlot {
 | 
			
		||||
                id: texSlotG
 | 
			
		||||
 | 
			
		||||
                rectColor: "green"
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            TexSlot {
 | 
			
		||||
                id: texSlotB
 | 
			
		||||
 | 
			
		||||
                rectColor: "blue"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ColumnLayout {
 | 
			
		||||
            Layout.fillWidth: true
 | 
			
		||||
 | 
			
		||||
            Layout.alignment: Qt.AlignHCenter
 | 
			
		||||
 | 
			
		||||
            ProgressBar {
 | 
			
		||||
                value: 0.5
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Button {
 | 
			
		||||
                Layout.alignment: Qt.AlignHCenter
 | 
			
		||||
                text: qsTr("Craft!")
 | 
			
		||||
 | 
			
		||||
                onClicked: crafter.packChannels([texSlotR.filePath, texSlotG.filePath, texSlotB.filePath])
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ColumnLayout {
 | 
			
		||||
            Layout.fillWidth: true
 | 
			
		||||
 | 
			
		||||
            Layout.alignment: Qt.AlignHCenter
 | 
			
		||||
 | 
			
		||||
            TexSlot {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                rectColor: "green"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								TexSlot.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								TexSlot.qml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
import QtQuick
 | 
			
		||||
import QtQuick.Layouts
 | 
			
		||||
import QtQuick.Controls
 | 
			
		||||
 | 
			
		||||
DropArea {
 | 
			
		||||
    property string rectColor: "white"
 | 
			
		||||
    property url filePath: ""
 | 
			
		||||
 | 
			
		||||
    Layout.alignment: Qt.AlignCenter
 | 
			
		||||
 | 
			
		||||
    width: 128
 | 
			
		||||
    height: 128
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Rectangle {
 | 
			
		||||
        id: rectangle
 | 
			
		||||
        anchors.fill: parent
 | 
			
		||||
        color: rectColor
 | 
			
		||||
 | 
			
		||||
        Image {
 | 
			
		||||
            id: image
 | 
			
		||||
 | 
			
		||||
            anchors.centerIn: parent
 | 
			
		||||
 | 
			
		||||
            width: 96
 | 
			
		||||
            height: 96
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Label {
 | 
			
		||||
        id: huh
 | 
			
		||||
 | 
			
		||||
        text: "無"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onEntered: {
 | 
			
		||||
        rectangle.color = "cyan";
 | 
			
		||||
        drag.accept (Qt.LinkAction);
 | 
			
		||||
    }
 | 
			
		||||
    onDropped: {
 | 
			
		||||
        // TODO: handle dragging all channels at once
 | 
			
		||||
        var firstUrl = new URL(drop.urls[0]);
 | 
			
		||||
        if (firstUrl.protocol === "file:")
 | 
			
		||||
        {
 | 
			
		||||
        console.log(drop.urls);
 | 
			
		||||
 | 
			
		||||
            filePath = drop.urls[0];
 | 
			
		||||
        huh.text = drop.urls[0];
 | 
			
		||||
        image.source = drop.urls[0];
 | 
			
		||||
        }
 | 
			
		||||
        rectangle.color = rectColor;
 | 
			
		||||
    }
 | 
			
		||||
    onExited: {
 | 
			
		||||
        rectangle.color = rectColor;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								main.cpp
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
#include <QGuiApplication>
 | 
			
		||||
#include <QQmlApplicationEngine>
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    QGuiApplication app(argc, argv);
 | 
			
		||||
 | 
			
		||||
    QQmlApplicationEngine engine;
 | 
			
		||||
    const QUrl url(QStringLiteral("qrc:/texcrafting/Main.qml"));
 | 
			
		||||
    QObject::connect(
 | 
			
		||||
        &engine,
 | 
			
		||||
        &QQmlApplicationEngine::objectCreated,
 | 
			
		||||
        &app,
 | 
			
		||||
        [url](QObject *obj, const QUrl &objUrl) {
 | 
			
		||||
            if (!obj && url == objUrl)
 | 
			
		||||
                QCoreApplication::exit(-1);
 | 
			
		||||
        },
 | 
			
		||||
        Qt::QueuedConnection);
 | 
			
		||||
    engine.load(url);
 | 
			
		||||
 | 
			
		||||
    return app.exec();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								texturecrafter.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								texturecrafter.cpp
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
#include "texturecrafter.h"
 | 
			
		||||
 | 
			
		||||
TextureCrafter::TextureCrafter(QObject *parent)
 | 
			
		||||
    : QObject{parent}
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
void TextureCrafter::packChannels(QVector<QUrl> imagePaths) {
 | 
			
		||||
    QVector<QImage> sourceImages;
 | 
			
		||||
    int width = 0, height = 0;
 | 
			
		||||
    QImage::Format format = QImage::Format_RGB888;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < imagePaths.length(); i++) {
 | 
			
		||||
        // if the ui layer did its job this will always be a file:// url
 | 
			
		||||
        QString rawPath = imagePaths[i].path();
 | 
			
		||||
        QImage newImage(rawPath); // would this cause a use after free idk
 | 
			
		||||
 | 
			
		||||
        // we just use the first image's dimensions and force the others to conform hehe
 | 
			
		||||
        if (width == 0) {
 | 
			
		||||
            width = newImage.width();
 | 
			
		||||
        }
 | 
			
		||||
        if (height == 0) {
 | 
			
		||||
            height = newImage.height();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sourceImages.append(newImage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QImage outImage(width, height, format);
 | 
			
		||||
 | 
			
		||||
    // theres probably a faster way to do this but eh
 | 
			
		||||
    for (int i = 0; i < width; i++) {
 | 
			
		||||
        for (int j = 0; j < height; j++) {
 | 
			
		||||
            int r, g, b;
 | 
			
		||||
 | 
			
		||||
            // too eepy for dry
 | 
			
		||||
            r = sourceImages.at(0).pixelColor(i, j).red();
 | 
			
		||||
            g = sourceImages.at(1).pixelColor(i, j).green();
 | 
			
		||||
            b = sourceImages.at(2).pixelColor(i, j).blue();
 | 
			
		||||
 | 
			
		||||
            QColor newColor(r, g, b);
 | 
			
		||||
 | 
			
		||||
            outImage.setPixelColor(i, j, newColor);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    outImage.save("/tmp/out.png");
 | 
			
		||||
 | 
			
		||||
    //do we need to close these??? idk lets hope qt handles it
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								texturecrafter.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								texturecrafter.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
#ifndef TEXTURECRAFTER_H
 | 
			
		||||
#define TEXTURECRAFTER_H
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QQmlEngine>
 | 
			
		||||
#include <QImage>
 | 
			
		||||
 | 
			
		||||
class TextureCrafter : public QObject
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
    QML_ELEMENT
 | 
			
		||||
public:
 | 
			
		||||
    explicit TextureCrafter(QObject *parent = nullptr);
 | 
			
		||||
 | 
			
		||||
    Q_INVOKABLE void packChannels(QVector<QUrl> images);
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
private:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // TEXTURECRAFTER_H
 | 
			
		||||
		Loading…
	
		Reference in a new issue