mafulechka
mafulechka02 вересня 2019 р. 05:04

Qt Quick 3D: високорівневий 3D API для Qt Quick

Розробники вивчали, як можна глибше інтегрувати 3D і Qt Quick, в результаті чого створили новий проект під назвою Qt Quick 3D , який надає собою високорівневий API для створення 3D-контенту для інтерфейсів користувача з Qt Quick. Замість використання зовнішнього двигуна, який може призвести до проблем синхронізації анімації та кількох рівнів абстракції, Qt Company надає розширення для Qt Quick Scenegraph для 3D-контенту та засіб візуалізації для цих розширених вузлів графа сцени.

Чи це означає, що вони написали ще одне 3D Solution для Qt? Не зовсім так, тому що ядро просторового рендерингу отримано із рендерера Qt 3D Studio. Цей рендерер був портований для використання Qt для абстракції платформи і зазнав рефакторингу для відповідності стилю кодування проекту Qt.



”Сан-Мігель” тестова сцена, запущена у Qt Quick 3D.

Які цілі Qt Company? Чому інше 3D Solution?

Уніфікована графічна історія

Найважливіша мета - уніфікувати графічну історію. В даний час Qt Company пропонує два комплексні рішення для створення гнучких інтерфейсів користувача, кожне з яких має свій власний інструментарій. Одне з цих рішень – Qt Quick для 2D, інше – Qt 3D Studio для 3D. Якщо ви обмежуєте себе використанням одного чи іншого, зазвичай все працює досить добре. Проте, розробники виявили, що користувачам, зрештою, доводиться їх змішувати і зіставляти, що виявляє багато «підводних каменів», як у продуктивності під час виконання, і у досвіді розробників/дизайнерів.

Тому для простоти Qt Company прагне створити одне середовище виконання (Qt Quick), один загальний граф сцени (Qt Quick Scenegraph) та один інструмент проектування (Qt Design Studio). Не повинно бути жодних компромісів у функціях, продуктивності чи досвіді розробника/дизайнера. Таким чином, немає потреби в подальшому розділяти розробки на більшу кількість продуктів, і тим самим вони зможуть швидше надавати більше функцій та виправлень.

Інтуїтивно зрозумілий і простий у використанні API

Наступна мета для Qt Quick 3D – надати API для визначення 3D-контенту. API, який доступний та зручний для розробників без необхідності розуміти тонкі деталі сучасного графічного конвеєра. Зрештою, більшості користувачів не потрібно створювати спеціалізовані засоби візуалізації 3D-графіки для кожного зі своїх додатків, а просто потрібно показувати деякий 3D-контент часто поряд з 2D. Тому розробляється Qt Quick 3D із цього погляду.

При цьому з часом все більше і більше розкриватиметься API рендеринг, що уможливить більш складні варіанти використання, необхідні досвідченим користувачам.

На момент написання цієї статті Qt Company надавала тільки API QML, але в майбутньому вони хочуть надати відкритий API C++.

Уніфікований інструментарій для Qt Quick

Qt Quick 3D покликаний стати наступником Qt 3D Studio . В даний час Qt 3D Studio все ще буде розвиватися, але в довгостроковій перспективі його замінять Qt Quick і Qt Design Studio.

Розробники мають намір взяти найкращі частини Qt 3D Studio і перенести їх у Qt Quick та Qt Design Studio. Тому замість того, щоб потребувати окремого інструменту для Qt Quick або 3D, можна буде взяти і те, й інше з Qt Design Studio. Зараз триває робота над деталями та Qt Company сподівається отримати попередній перегляд найближчим часом.

Для існуючих користувачів Qt 3D Studio вони працюють над інструментом портування для перетворення проектів у Qt Quick 3D. Докладніше про це пізніше.

Перший клас Asset'ів обробного конвеєра

При роботі з 3D-сценами стан системи asset'ів стає більш важливим, тому що тепер використовується більше типів asset'ів, і в цілому вони, як правило, значно більші. Тому при розробці Qt Quick 3D розробники намагалися зрозуміти, як можна максимально спростити імпорт вашого контенту та перетворити його на ефективні формати часу виконання для Qt Quick.

Наприклад, під час розробки ви захочете вказати використовувані asset'и на основі того, що генерують ваші інструменти створення asset'ів (наприклад, файли FBX з Maya для 3D-моделей або PSD-файли з Photoshop для текстур), але під час виконання ви не захочете використовувати двигун для цих форматів. Натомість ви захочете перетворити asset'и на деякий ефективний формат часу виконання та оновлювати їх щоразу при зміні вихідних asset'ів. Qt Company хочуть, щоб це був максимально автоматизований процес, і тому хочуть вбудувати його в систему складання та інструментарій Qt.

Міжплатформна продуктивність та сумісність

Іншою метою є підтримка кількох власних графічних API-інтерфейсів з використанням нового Rendering Hardware Interface, що додається Qt. В даний час Qt Quick 3D підтримує рендеринг тільки з використанням OpenGL, як і багато інших компонентів Qt. Однак, у Qt 6 буде використовуватися QtRHI як графічна абстракція, і там можна буде підтримувати рендеринг через Vulkan, Metal і Direct3D, на додаток до OpenGL.

Що таке Qt Quick 3D?

Qt Quick 3D - це не заміна Qt 3D, а скоріше розширення функціональності Qt Quick для рендерингу 3D-контенту з використанням високорівневого API.

Ось як виглядає дуже простий проект із корисними примітками:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick3D 1.0

Window {
  id: window
  visible: true
  width: 1280
  height: 720

  // Viewport for 3D content
  View3D {
    id: view

    anchors.fill: parent
    // Scene to view
    Node {
      id: scene

      Light {

        id: directionalLight

      }

      Camera {
        id: camera
        // It's important that your camera is not inside 
        // your model so move it back along the z axis
        // The Camera is implicitly facing up the z axis,
        // so we should be looking towards (0, 0, 0)
        z: -600
      }

      Model {
        id: cubeModel
        // #Cube is one of the "built-in" primitive meshes
        // Other Options are:
        // #Cone, #Sphere, #Cylinder, #Rectangle
        source: "#Cube"

        // When using a Model, it is not enough to have a 
        // mesh source (ie "#Cube")
        // You also need to define what material to shade
        // the mesh with. A Model can be built up of 
        // multiple sub-meshes, so each mesh needs its own
        // material. Materials are defined in an array, 
        // and order reflects which mesh to shade

        // All of the default primitive meshes contain one
        // sub-mesh, so you only need 1 material.

        materials: [

          DefaultMaterial {

            // We are using the DefaultMaterial which 
            // dynamically generates a shader based on what
            // properties are set. This means you don't 
            // need to write any shader code yourself.  
            // In this case we just want the cube to have
            // a red diffuse color.
            id: cubeMaterial
            diffuseColor: "red"
          }
        ]
      }
    }
  }
}

Ідея полягає в тому, що визначення 3D-контенту має бути таким самим простим, як 2D. Є кілька додаткових речей, які вам знадобляться, наприклад, концепції Lights, Cameras та Materials (Світло, Камери та Матеріали), але вони є концепціями сцени високого рівня, а не деталями реалізації графічного конвеєра.

Цей простий API, звичайно ж, коштує дешевше. Хоча є можливість налаштувати матеріали і вміст сцени, неможливо повністю налаштувати спосіб візуалізації сцени, на відміну від Qt 3D за допомогою діаграми кадрів, що настроюється. Натомість на даний момент є фіксований передній рендерер (візуалізатор), де ви можете визначити властивості сцени та як вони відображатимуться. Це схоже на інші існуючі двигуни, які зазвичай мають кілька можливих конвеєрів рендерингу, які потім візуалізують логічну сцену.


Камера, що обертається навколо моделі автомобіля у скайбоксі з осями та лініями сітки (примітка: stutter від GIF 12 FPS).

Що ви можете зробити з Qt Quick 3D?

Він може робити багато речей, але вони створюються з використанням наступних примітивів сцени:

Node (Вузол)

Node є базовим компонентом будь-якого вузла в 3D-сцені. Він є перетворення (трансформацію) в тривимірному просторі, але не є візуальним. Він працює аналогічно тому, як працює Item type Qt Quick.

Камера

Camera уявляє, як сцена проектується на 2D поверхню. Камера має положення у тривимірному просторі (оскільки це підклас Node) та проекцію. Для рендерингу сцени вам потрібно мати хоча б одну камеру.

Світло (Світ)

Компонент Light визначає джерело освітлення в сцені принаймні для матеріалів, які використовують освітлення. На даний момент існує 3 типи джерел світла: Directional (спрямований (за замовчуванням)), Point (точковий) та Area (що охоплює область).

Model (Модель)

Компонент Model є єдиним візуальним компонентом сцени. Він є комбінацією геометрії (з сітки) і одного або декількох матеріалів.

Властивість source (джерело) компонента Mesh очікує на файл .mesh , який є форматом часу виконання, що використовується Qt Quick 3D. Щоб отримати файли mesh (сітки), необхідно конвертувати 3D-моделі за допомогою asset import tool (інструменту імпорту asset'ів). Є також кілька вбудованих примітивів. Вони можуть бути використані шляхом встановлення наступних значень для властивості source (джерела): #Cube, #Cylinder, #Sphere, #Cone або #Rectangle.

Також доданий програмний спосіб визначення вашої власної геометрії під час виконання, але він поки що недоступний у попередньому перегляді.

Перш ніж Model (Модель) може бути візуалізована, вона також повинна мати Material (Матеріал). Це визначає, як сітка (mesh) затінена.

Матеріали за замовчуванням (Default Material) та нестандартні матеріали (Custom Materials)

Компонент DefaultMaterial є простим у використанні вбудованим матеріалом. Все, що потрібно зробити, це створити цей матеріал, встановити властивості, які ви хочете визначити, і під капотом автоматично буде створено весь необхідний код шейдера. Решта властивостей, які ви встановлюєте на сцені, також враховуються. Не потрібно самостійно писати код графічного шейдера (наприклад, вершинний або фрагментний шейдер).

Також можна визначити так звані CustomMaterials, де ви надаєте свій власний код шейдера. Qt Company також надає бібліотеку певних заздалегідь CustomMaterials, які ви можете спробувати, просто додавши в свій імпорт QML наступне:
імпорт QtQuick3D.MaterialLibrary 1.0

Текстура

Компонент Texture представляє текстуру в 3D сцені, а також те, як вона відображається в сітці (mesh). Джерелом текстури може бути файл зображення або компонент QML (QML Component).

Зразок доступних функцій

3D види в Qt Quick

Щоб переглянути 3D-контент Qt Quick, необхідно вирівняти його на 2D-поверхні. Для цього використовується компонент View3D. View3D - єдиний заснований на QQuickItem компонент у всьому API. Ви можете визначити сцену як дочірню для View3D або послатися на існуючу сцену, встановивши властивість сцени в кореневий вузол (Node) сцени, яку ви хочете візуалізувати.

Якщо ви маєте кілька камер, ви також можете вказати, яку камеру ви хочете використовувати для рендерингу сцени. За промовчанням він використовуватиме лише першу активну камеру, визначену у сцені.

Також варто зазначити, що елементи View3D не обов'язково мають відображатися поза екранними текстурами перед візуалізацією. Можна встановити один із 4 наступних режимів рендерингу, щоб визначити, коли відображається 3D-контент:

1. Texture (Текстура): View3D є провайдером текстур Qt Quick і відображає вміст у текстуру через FBO.

2. Underlay (Підкладка): View3D візуалізується до відображення 2D-контенту Qt Quick безпосередньо у вікні (3D завжди знаходиться під 2D).

3. Overlay (Накладення): View3D відображається після рендерингу 2D-контенту Qt Quick безпосередньо у вікно (3D завжди більше 2D).

4. RenderNode: View3D візуалізується відповідно до вмісту Qt Quick 2D. Однак це може призвести до деяких дивацтв через те, як Qt Quick 2D використовує буфер глибини Qt 5.

2D види всередині 3D

Можливо, ви також захочете візуалізувати вміст Qt Quick усередині 3D-сцени. Для цього скрізь, де Текстура береться як значення властивості (наприклад, у властивості diffuseMap Material за замовчуванням), ви можете використовувати Текстуру із встановленою властивістю sourceItem замість простої вказівки файлу у властивості source . Таким чином, посилання на елемент Qt Quick буде автоматично відображено та використано як текстуру.


Текстури дифузного кольору, які відображаються на куби, є анімованими елементами Qt Quick 2D.

Компоненти 3D QML

Завдяки тому, що Qt Quick 3D побудований на QML, можна також створювати повторно використовувані компоненти для 3D. Наприклад, якщо ви створюєте модель автомобіля, що складається з декількох моделей, просто збережіть її в Car.qml. Потім ви можете створити кілька екземплярів Автомобіля, просто використовуючи його повторно, як будь-який інший тип QML. Це дуже важливо, тому що таким чином 2D і 3D сцени можуть бути створені за допомогою однієї і тієї ж компонентної моделі, замість того, щоб мати справу з різними підходами для 2D і 3D сцен.

Кілька переглядів однієї і тієї ж сцени

Оскільки визначення сцен можуть існувати у будь-якому місці проекту Qt Quick, можна посилатися на них із кількох View3D. Якщо у вас було кілька камер у сцені, ви могли б навіть зробити рендеринг із кожної камери на інший View3D.


4 види однієї і тієї ж сцени з чайником. Також змінюється між 3 камерами у перспективі.

Тіні

Будь-який компонент Light може вказати, що він відкидає тіні. Коли він увімкнений, тіні автоматично відображаються на сцені. Залежно від того, що ви робите, рендеринг тіней може бути досить дорогим, тому можна регулювати, які компоненти Моделі відкидають тіні, встановлюючи додаткові властивості в Моделі.

Основане на зображенні освітлення

На додаток до стандартних компонентів Light, можна висвітлити сцену, визначаючи карту HDRI. Цю Текстуру можна встановити або для всього View3D як SceneEnvironment , або для окремих Матеріалів.

Анімації

Анімації в Qt Quick 3D використовують ту саму систему анімації, що й Qt Quick. Ви можете прив'язати будь-яку властивість до аніматора, і вона буде анімована та оновлена, як очікувалося. Використовуючи модуль QtQuickTimeline, також можна використовувати анімації на основі ключових кадрів.

Як і компонентна модель, це ще один важливий крок у скороченні розриву між 2D та 3D-сценами, оскільки тут не використовуються окремі, потенційно конфліктуючі системи анімації.

Наразі немає підтримки фальсифікованих анімацій, але це планується у майбутньому.

Як спробувати Qt Quick 3D?

Намір полягає в тому, щоб випустити Qt Quick 3D як технічний попередній перегляд разом з випуском Qt 5.14. Тим часом його можна буде використовувати вже зараз, проти Qt 5.12 і вище.

Щоб отримати код, вам потрібно зібрати модуль QtQuick3D, який знаходиться тут:
https://git.qt.io/annichol/qtquick3d

Що щодо інструментів?

Ціль полягає в тому, щоб через Qt Design Studio можна було зробити все необхідне для налаштування 3D-сцени. Це означає, що ви можете візуально розмітити сцену, імпортувати 3D asset'и, такі як сітки, матеріали та текстури, і перетворити ці asset'и в ефективні формати часу виконання, що використовуються двигуном.


Демонстрація ранньої інтеграції Qt Design Studio для Qt Quick 3D.

Імпорт 3D-сцен до компонентів QML

Qt Quick 3D також можна використовувати, написавши QML код вручну. Тому також є кілька автономних утиліт для конвертації asset'ів. Колись такий інструмент був інструментом підготовки balsam asset. Зараз можна передати цій утиліті asset з інструмента створення 3D-активів, такого як Blender, Maya або 3DS Max, і він згенерує компонент QML, що представляє сцену, а також будь-які текстури, сітки і матеріали, які він використовує. В даний час цей інструмент підтримує створення сцен із наступних форматів:
• FBX
• Колада (dae)
• OBJ
• Блендер (суміш)
• GLTF2

Щоб перетворити файл myTestScene.fbx, ви повинні виконати:

./balsam -o ~/exportDirectory myTestScene.fbx

Це створить файл з ім'ям MyTestScene.qml разом із будь-якими необхідними asset'ами. Тоді ви можете просто використовувати його як будь-який інший компонент у вашій сцені:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick3D 1.0

Window {
 width: 1920
 height: 1080
 visible: true
 color: "black"

 Node {
   id: sceneRoot
   Light { 
   }
   Camera {
   z: -100
   }
   MyTestScene {
   }
 }

 View3D {
   anchors.fill: parent
   scene: sceneRoot
 }
}

Qt Company працює над покращенням asset'ів, створюваних цим інструментом, тому очікуються покращення найближчими місяцями.

Конвертація проектів Qt 3D Studio

На додаток до можливості генерувати компоненти 3D QML із інструментів створення 3D-asset'ів, також було створено плагін для інструменту імпорту asset'ів для перетворення існуючих проектів Qt 3D Studio. Якщо ви раніше використовували Qt 3D Studio, ви знатимете, що він генерує проекти у форматі XML для визначення сцени. Якщо ви передасте інструменту balsam проект UIP або UIA, згенерований Qt 3D Studio, він також згенерує проект Qt Quick 3D на основі цього. Однак зверніть увагу, що оскільки середовище виконання, що використовується Qt 3D Studio, відрізняється від Qt Quick 3D, не все буде перетворено. Тим не менш, він повинен дати хороше наближене значення або точку відправлення для перетворення існуючого проекту. Qt Company сподівається продовжити покращення підтримки цього шляху, щоб згладити перехід для існуючих користувачів Qt 3D Studio.


Приклад програми Qt 3D Studio, портованої за допомогою інструмента імпорту Qt Quick 3D (це ще не ідеально).

Як щодо Qt 3D?

Перше питання, яке Qt Company очікує отримати, це чому б просто не використовувати Qt 3D? Це питання, яке вони вивчали останні кілька років.

Одне припущення полягає в тому, що можна просто зібрати весь Qt Quick поверх Qt 3D, якщо змішати 2D та 3D. Qt Company збиралися та почали робити це з випуском 2.3 Qt 3D Studio. Потужний API Qt 3D надав хорошу абстракцію для реалізації движка рендерингу, щоб відтворити поведінку Qt Quick і Qt 3D Studio. Однак, архітектура Qt 3D ускладнює отримання необхідної продуктивності на вбудованому устаткуванні початкового рівня. Qt 3D також має певні витрати через власне обмежене середовище виконання, а також через те, що є ще одним рівнем абстракції між Qt Quick і графічним обладнанням. У своїй нинішній формі Qt 3D не ідеальний для подальшого розвитку, якщо вони хочуть досягти повністю уніфікованої графічної історії, забезпечуючи при цьому постійну підтримку для широкого спектру платформ і пристроїв, починаючи від низького до високого класу.

У той же час вже був двигун рендерингу в Qt 3D Studio, який робив саме те, що потрібно, і був гарною основою для створення додаткових функціональних можливостей. Це пов'язано з недоліком, що полягає в тому, що у них більше немає потужних API, які йдуть з Qt 3D, але на практиці, коли ви починаєте створювати середовище виконання поверх Qt 3D, ви вже в кінцевому підсумку приймаєте рішення про те, як все має Працює, що в будь-якому випадку призводить до обмеженої можливості налаштувати рамкуграфа (граф кадру). Зрештою, найбільш практичним рішенням було використовувати існуючий двигун рендерингу Qt 3D Studio як основу і спиратися на нього.

Який план просування вперед?

Цей реліз – лише попередній перегляд того, що має бути. Планується надати Qt Quick 3D як повністю підтримуваний модуль разом з Qt 5.15 LTS. Тим часом Qt Company працює над подальшою розробкою Qt Quick 3D як реліз Tech Preview з Qt 5.14.

Для серії Qt 5 вони обмежені в тому, наскільки глибоко можуть комбінувати 2D і 3D через обіцянок двійкової сумісності. З випуском Qt 6 Qt Company планує ще глибшу інтеграцію Qt Quick 3D у Qt Quick, щоб забезпечити ще більш плавну роботу.

Ціль у тому, що вони хочуть бути максимально ефективними при змішуванні 2D і 3D контенту, без додаткових витрат для користувачів, які взагалі не використовують 3D контент. Вони не будуть робити нічого радикального, наприклад, змушувати всі програми Qt Quick проходити через новий рендер, тільки ті, які змішують 2D та 3D.

У Qt 6 також буде використовуватися апаратний інтерфейс рендерингу Qt для рендерингу сцен Qt Quick (включаючи 3D), що має усунути багато поточних проблем, з якими Qt Company стикається сьогодні при розгортанні додатків OpenGL (з використанням DirectX в Windows, Metal в macOS і т.д. д.).

Qt Company також бажає, щоб кінцеві користувачі могли використовувати C++ Rendering API, який створили узагальнено, без Qt Quick. Код тепер, як у приватного API, але вони чекають часу Qt 6 (і портування RHI), перш ніж робити обіцянки сумісності, які йдуть із загальнодоступними API.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

qml_puthon_user
  • 02 грудня 2019 р. 11:39

Доброго времени суток. Подскажите пожалуйста, я вызываю файл qml через python-скрипт. QtQuick работает нормально, но, когда дописываю import QtQuick3D 1.0, мне выдаётся ошибка, что модуль не установлен. У меня стоит ещё QtDesignStudio, так же прописываю в ней импорт и всё работает нормально, и при запуске GUI из самой студии, всё работает. Почему же тогда из питона не работает? Работаю под Windows пока что. Со сборкой модуля не справился, не знаю, как правильно делать. Спасибо!

Evgenii Legotckoi
  • 03 грудня 2019 р. 04:10

QtDesignStudio работает с C++, поэтому там работает, но вот относительно python думаю, что не все требуемые зависимости установлены для python пакетов.
К тому же, что именно вы используете для python? PyQt5 или Pyside?

qml_puthon_user
  • 03 грудня 2019 р. 04:11
  • (відредаговано)

PyQt5.

Evgenii Legotckoi
  • 03 грудня 2019 р. 04:20

Ясно. Я видел, что вы вопрос на форум задали. Я вечером после работы гляну у себя на домашнем ПК, запустится ли ваш код. У меня там Ubuntu и вроде бы все пакеты установлены для PyQt5. Но вполне может быть так, что это может и не работать для PyQt5

qml_puthon_user
  • 03 грудня 2019 р. 04:21

Хорошо, спасибо большое! :)

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10

C++ - Тест 003. Условия и циклы

  • Результат:42бали,
  • Рейтинг балів-8
Останні коментарі
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Тепер обговоріть на форумі
jd
jasmine disouza28 жовтня 2024 р. 04:58
GeForce Now India: Unlocking the Future of Cloud Gaming GeForce Now India has a major impact on the gaming scene by introducing NVIDIA's cloud gaming service to Indian gamers. GeForce Now India lets you stream top-notch PC games on any device, from b…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
J
JacobFib17 жовтня 2024 р. 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Игорь Максимов03 жовтня 2024 р. 04:05
Реализация навигации по разделам Спасибо Евгений!
JW
Jhon Wick01 жовтня 2024 р. 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…

Слідкуйте за нами в соціальних мережах