3d форум по Blender

Другое => Программирование (любое) => Тема начата: LanuHum от 30 Октябрь 2016, 20:17:55

Название: си плюс плюс
Отправлено: LanuHum от 30 Октябрь 2016, 20:17:55
Блин, уже ни столько узнать хочется, сколько поматериться.
И Шилдта букварь лежит, и интернет под боком...
Наследование. Я его родственник. Спроси кого, скажут, учи букварь.
Класс "объект", его потомки: "меш", "кривая". Меши и кривые нужно вогнать в один массив, что ни так страшно, как потом их оттуда извлечь.
Примеры есть, но в рендерерах... ни фига не выковыряю.
Да уж, а так хорошо всё начиналось.

Я это, конечно, в курилке мог написать, но решил положить начало теме по программированию на С++  :)
Название: Re: си плюс плюс
Отправлено: Samovar от 30 Октябрь 2016, 20:21:22
Ух ты ж :) Классная тема! :) .
...и всё ясно, но ни хрена не понятно , как обычно :)

Название: Re: си плюс плюс
Отправлено: mr.A от 30 Октябрь 2016, 20:26:34
Мне казалось ты разобрался http://blender-3d.ru/forum/index.php/topic,1239.0.html
А! То был С без ++?
Название: Re: си плюс плюс
Отправлено: LanuHum от 30 Октябрь 2016, 20:30:55
Мне казалось ты разобрался http://blender-3d.ru/forum/index.php/topic,1239.0.html
А! То был С без ++?
Да, то было без плюсов. Проконсультируешь?
Название: Re: си плюс плюс
Отправлено: mr.A от 30 Октябрь 2016, 20:35:59
Скорее нет, чем да. У меня слабые знания. Но кто мешает написать сюда вопрос? Ответ найдется.
Название: Re: си плюс плюс
Отправлено: sungreen от 30 Октябрь 2016, 20:37:11
... можешь хранить в массиве как тип "объект" извлекать как "объект", но сделать у класса "объект" наследуемую функцию  get_type , которая возвращает у каждого потомка свой код ("меш", "кривая") ...
... и далее делать приведение типа к нужному классу в зависимости от значения этой функции ...
Название: Re: си плюс плюс
Отправлено: LanuHum от 30 Октябрь 2016, 20:54:34
... можешь хранить в массиве как тип "объект" извлекать как "объект", но сделать у класса "объект" наследуемую функцию  get_type , которая возвращает у каждого потомка свой код ("меш", "кривая") ...
... и далее делать приведение типа к нужному классу в зависимости от значения этой функции ...
В этом коде всё правильно?
Код
// .h

class BlenderScene{
    public:
        std::map<std::string,BlenderObject*>    objects;
        BlenderScene();
        ~BlenderScene();
        void addObject(std::string name,BlenderMesh* mesh);
};

class BlenderObject{
    public:
        int Type;
        BlenderObject();
        ~BlenderObject();
};

class BlenderMesh : public BlenderObject{
    public:
        std::string name;
        BlenderMesh();
        ~BlenderMesh();
};


// .cpp

BlenderScene::BlenderScene(){}
BlenderScene::~BlenderScene(){}
BlenderScene::BlenderObject(){}
BlenderScene::~BlenderObject(){}
BlenderScene::BlenderMesh(){}
BlenderScene::~BlenderMesh(){}

void BlenderScene::addObject(std::string name,BlenderMesh* mesh){
    objects.insert ( pair<std::string,BlenderMesh*>(name,mesh) );
}
Название: Re: си плюс плюс
Отправлено: sungreen от 30 Октябрь 2016, 21:23:54
... этот код не демонстрирует твоей проблемы и не решает её ...

... почему добавляя объект ты ссылаешься на меш? ...
Название: Re: си плюс плюс
Отправлено: LanuHum от 30 Октябрь 2016, 21:45:09
... этот код не демонстрирует твоей проблемы и не решает её ...

... почему добавляя объект ты ссылаешься на меш? ...
Ну, я начал по-порядку. И, у тебя уже есть вопросы. И у меня. Это мне как раз, и не очень-то понятно.
Допустим, у меня есть данные для меша, в данном случае имя. Что мне делать? Я делаю так:
BlenderMesh *mesh = new BlenderMesh();
mesh -> name = obname;
Так как меш наследник объекта, я и пишу его в map, как объект... понимаю, что, скорее всего, это неверно, и это первый повод материться.
Как мне превратить меш в объект?
Название: Re: си плюс плюс
Отправлено: Striver от 30 Октябрь 2016, 21:51:36
Например, так
Код
BlenderObject *mesh = new BlenderMesh();
Название: Re: си плюс плюс
Отправлено: Striver от 30 Октябрь 2016, 21:55:48
Цитировать
Класс "объект", его потомки: "меш", "кривая". Меши и кривые нужно вогнать в один массив, что ни так страшно, как потом их оттуда извлечь.
Вот из-за подобной хрени меня бесят языки со статической типизацией... В питоне такой проблемы нет, и можно даже иерархии классов не строить.
Название: Re: си плюс плюс
Отправлено: mr.A от 30 Октябрь 2016, 21:56:01
Не конпеляется. Пиши еще  :P . А если серьезно, то даже в твоем простом коде я уже ноги сломал. Объясни словами, что от чего хочешь наследовать или что там? Может и я пойму что.
Название: Re: си плюс плюс
Отправлено: sungreen от 30 Октябрь 2016, 21:57:56
>> и пишу его в map, как объект
... только добавлять нужно void addObject(std::string name,BlenderObject* ob) ...

BlenderMesh *mesh = new BlenderMesh();
mesh -> name = obname;
scene->addObject(name,mesh)

... если вызов addObject(name,mesh) не прокатит, пробуй addObject(name, (BlenderObject*) mesh) ...
... при этом name у тебя есть в объекте и name будет в списке? ...

... после того как получишь из списка BlenderObject* можешь сделать mesh=(BlenderMesh*) object ...


... сделай еще в BlenderObject наследуюмую функцию get_type которая возвращает код типа объекта ...
Название: Re: си плюс плюс
Отправлено: LanuHum от 30 Октябрь 2016, 21:58:21
Например, так
Код
BlenderObject *mesh = new BlenderMesh();
Пытался:
 error: 'class povanim::BlenderObject' has no member named 'name'
Название: Re: си плюс плюс
Отправлено: sungreen от 30 Октябрь 2016, 22:00:50
а так?
BlenderObject *mesh = (BlenderObject*) new BlenderMesh();
Название: Re: си плюс плюс
Отправлено: Striver от 30 Октябрь 2016, 22:02:15
Цитировать
Пытался:
 error: 'class povanim::BlenderObject' has no member named 'name'
Ну так и объяви name в объекте, а не в меше.
Название: Re: си плюс плюс
Отправлено: LanuHum от 30 Октябрь 2016, 22:27:26
>> и пишу его в map, как объект
... только добавлять нужно void addObject(std::string name,BlenderObject* ob) ...

BlenderMesh *mesh = new BlenderMesh();
mesh -> name = obname;
scene->addObject(name,mesh)

... если вызов addObject(name,mesh) не прокатит, пробуй addObject(name, (BlenderObject*) mesh) ...
... при этом name у тебя есть в объекте и name будет в списке? ...

... после того как получишь из списка BlenderObject* можешь сделать mesh=(BlenderMesh*) object ...


... сделай еще в BlenderObject наследуюмую функцию get_type которая возвращает код типа объекта ...
Значит, я правильно тебе предоставил данные, и правильно это использовал в своей проге (а, вот addObject(name, (BlenderObject*) mesh) не катит):
Код
-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.28")
-- Checking for one of the modules 'python3'
-- Checking for one of the modules 'fox'
-- Configuring done
-- Generating done
-- Build files have been written to: /home/leonid/workspace/programming/povanim_devel/build
Scanning dependencies of target povanim
[ 14%] Building CXX object CMakeFiles/povanim.dir/src/BlenderMesh.cpp.o
[ 28%] Building CXX object CMakeFiles/povanim.dir/src/RenderGUI.cpp.o
[ 42%] Building CXX object CMakeFiles/povanim.dir/src/main.cpp.o
[ 57%] Building CXX object CMakeFiles/povanim.dir/src/BlenderScene.cpp.o
[ 71%] Building CXX object CMakeFiles/povanim.dir/src/BlenderObject.cpp.o
[ 85%] Building CXX object CMakeFiles/povanim.dir/src/Vector.cpp.o
[100%] Linking CXX executable povanim
[100%] Built target povanim
Это значит, что я не знаю ничего про get_type, ибо тогда проблема в этой функции, где я пытался взять тип из меша:
Код
bool BlenderScene::addBlenderObject(std::string name){
    BlenderObject *bobject = objects.find(name) -> second;
    if (!bobject)
        return false;
    switch (bobject -> type) {
        case 2: {
            //Mesh *mesh = new Mesh();
            // reinterpret Blender mesh data to Povray mesh data
            // bla-bla-bla
        }
        case 1: { std::cout<<"Type: "<<"CSG"<<std::endl; break; } //del
        default: { std::cout<<"Type: "<<"BLOB"<<std::endl; } //del
    }
    return true;
}

Scanning dependencies of target povanim
[ 14%] Building CXX object CMakeFiles/povanim.dir/src/BlenderMesh.cpp.o
[ 28%] Building CXX object CMakeFiles/povanim.dir/src/RenderGUI.cpp.o
[ 42%] Building CXX object CMakeFiles/povanim.dir/src/main.cpp.o
[ 57%] Building CXX object CMakeFiles/povanim.dir/src/BlenderScene.cpp.o
/home/leonid/workspace/programming/povanim_devel/Povanim/src/BlenderScene.cpp: In member function 'bool BlenderScene::addBlenderObject(std::string)':
/home/leonid/workspace/programming/povanim_devel/Povanim/src/BlenderScene.cpp:194:24: error: 'class povanim::BlenderObject' has no member named 'type'
     switch (bobject -> type) {

Название: Re: си плюс плюс
Отправлено: LanuHum от 30 Октябрь 2016, 22:46:07
Не конпеляется. Пиши еще  :P . А если серьезно, то даже в твоем простом коде я уже ноги сломал. Объясни словами, что от чего хочешь наследовать или что там? Может и я пойму что.
Уже написал. Качай, конпеляй:
https://github.com/Lanuhum/Povanim

Цитировать
Класс "объект", его потомки: "меш", "кривая". Меши и кривые нужно вогнать в один массив, что ни так страшно, как потом их оттуда извлечь.
Вот из-за подобной хрени меня бесят языки со статической типизацией... В питоне такой проблемы нет, и можно даже иерархии классов не строить.
Да, я всё понимаю. Сам хотел все проблемы решить питоном. Но... нам может не нравиться форма ракеты...без гравицапы можно только по горизонтали, а с гравицапой в любую точку вселенной за 5 секунд...
Название: Re: си плюс плюс
Отправлено: mr.A от 30 Октябрь 2016, 23:33:50
Почему ты выбрал Fox, а не Qt например?
Название: Re: си плюс плюс
Отправлено: Samovar от 31 Октябрь 2016, 07:20:57
Почему ты выбрал Fox, а не Qt например?
говорит, что этот GUI  быстрее... но мне до сих пор непонятно, почему он начинает свои проги с обёртки, а не с начинки...
Название: Re: си плюс плюс
Отправлено: Striver от 31 Октябрь 2016, 09:18:29
Цитировать
Допустим, у меня есть данные для меша, в данном случае имя. Что мне делать? Я делаю так:
BlenderMesh *mesh = new BlenderMesh();
mesh -> name = obname;
Так как меш наследник объекта, я и пишу его в map, как объект... понимаю, что, скорее всего, это неверно, и это первый повод материться.
Как мне превратить меш в объект?

Блин, мой вчерашний ответ
Цитировать
Например, так
Код: [Выделить]

BlenderObject *mesh = new BlenderMesh();
был формально правильным, но без разъяснений на 200 страницах абсолютно бесполезным, а времени долго отвечать особо не было, да и мозги хреново работали.

Попытаюсь ответить заново...

Яростные адепты ООП с топорами и в черных балахонах требуют, чтобы действия вроде
Код
mesh -> name = obname;
возможно было выполнять ТОЛЬКО из функций внутри объекта. Все так называемые данные-члены должны быть объявлены закрытыми (private). Функции класса BlenderMesh, конечно же, будут видеть свойство name, а всем остальным неположено.
Если мы создаём объект типа BlenderMesh, но присваиваем его указателю типа BlenderObject, то нам остаётся надеяться только на "магию виртуальных функций". Лучше про них отдельно прочитать в толстой книжке, но и я попробую кратко рассказать.
В классе BlenderObject мы объявляем виртуальную функцию:
Код
class BlenderObject{
...
virtual SuperFunction();
...
};

и классе BlenderMesh мы объявляем функцию с тем же именем:
Код
class BlenderMesh{
...
virtual SuperFunction();
...
};

ключевое слово virtual для наших целей обязательно.
Теперь, если мы у объекта (типа BlenderMesh), на который указывает указатель *mesh (а тип указателя BlenderObject), вызываем функцию SuperFunction,
Код
mesh -> SuperFunction();
то для объекта будет вызвана его личная функция. Если внутри этой функции есть строка
Код
this.name = obname;
она без проблем отработает.
Название: Re: си плюс плюс
Отправлено: Striver от 31 Октябрь 2016, 09:34:02
Но все эти рассуждения правильны для какой-нибудь переменной класса BlenderMesh, которой нет в классе BlenderObject. Переменную name, в которой содержится имя объекта, лучше объявить в классе BlenderObject, всё равно она во всех его потомках понадобится. Тогда и присвоение этой переменной можно выполнять в функциях-членах BlenderObject, и не надо геморроиться с виртуальными функциями. Это я и имел ввиду, когда писал
Цитировать
Ну так и объяви name в объекте, а не в меше.
Название: Re: си плюс плюс
Отправлено: LanuHum от 31 Октябрь 2016, 17:46:01
Почему ты выбрал Fox, а не Qt например?
Потому что в ЭТО моё творение в конце концов будет включён полный код Поврея, пропатченный несколькими моими заплатками. Я действую с ведома разработчика Поврея и в согласии с лицензией Поврея. Я не силён в юридических аспектах программистской деятельности, но, по-моему, с Qt будут разногласия. Может, и с Лисом будут разногласия, но, я не достучался до них. Хотя, при успешной операции, возможно, Лиса заменит GTKMM-3.

говорит, что этот GUI  быстрее... но мне до сих пор непонятно, почему он начинает свои проги с обёртки, а не с начинки...
Тебе тоже советую начинать с обёртки, когда твоя программа будет зависеть от разного рода команд типа: "Открыть файл", "Подгрузить сцену ", "Запустить рендер" и так далее... :)
Кроме того, при запущенной гуёвине, я могу контролировать использование памяти и наблюдать ошибки, которых без гуёвины не пронаблюдать. Было так: жму кнопку рендер - памяти задействовано 900, ещё раз жму +450, ещё раз, ещё +450. Оказалось, что начинку пришлось полностью переписывать.
Переписал. Жму раз - 900, жму два - 900...жму десятый раз - 900, жму одиннадцатый раз - ошибка сегментирования. Каждый раз одиннадцатый случай - ошибка сегментирования. Как бы я это выявил без гуёвины? Именно, гуёвина помогла мне отыскать в начинке неверные решения. Теперь ошибок сегментирования нет.
Вывод напрашивается сам : гуёвина помогает мне изучать язык программирования С++
Но, собственно, это уже ни начало, а конец, почти. Осталось написать вот эту фунцию, про которую мы вчера тут беседовали. Далее, нужно писать патчи и впиливать Поврей. Когда всё получится, можно будет считать, что я достаточно изучил С++, чтобы продолжить работу над рендером на GPU.
:)
Название: Re: си плюс плюс
Отправлено: LanuHum от 31 Октябрь 2016, 18:09:59
...
Ничего мне не понятно. Ладно, name, но у меша есть массив полигонов, его как мне передать объекту? Вроде как передаю компилируется, меш становится объектом, а вытащить из него ничего не получается. Что ни запросишь, ничего нет из того, что должно быть. Такое ощущение, что меш превращается в пустой объект.
Я ж и говорю, что какая-то непонятная эта штука "наследование". Когда в букваре про лошадок, наездников и боевых единицах, то это одно, а когда наследуются массивы в массивах, то про это, наверное на шестом курсе университета рассказывают.
Я попробую без наследников. Попробую шаблон Data<T> использовать в классе "Объект" и создавать и вызывать объект:
BlenderObject *bobject = new BlenderObject();
Безо всяких там рокировок и подстановок BlenderMesh.
Название: Re: си плюс плюс
Отправлено: Striver от 31 Октябрь 2016, 18:28:39
Цитировать
Я попробую без наследников.
Тогда в массиве можно будет содержать только объекты типа BlenderObject. Разнородные объекты в один класс можно загнать, но это будет неудобно. Впрочем, в построении иерархий классов тоже мало удобства...

Цитировать
Ладно, name, но у меша есть массив полигонов, его как мне передать объекту?
А откуда тебе его надо передавать? Обычно это делают как-то так:
Код
class BlenderMesh{
private:
float* array;
int nsize
...
public:
...
void SetArray(float* array, int nsize);
...
};

void BlenderMesh::SetArray(float* array, int nsize){
this.nsize=nsize;
this.array=array;
};
И в  нужном месте вызывают функцию SetArray.
Название: Re: си плюс плюс
Отправлено: LanuHum от 31 Октябрь 2016, 18:50:03
Тогда в массиве можно будет содержать только объекты типа BlenderObject. Разнородные объекты в один класс можно загнать, но это будет неудобно. Впрочем, в построении иерархий классов тоже мало удобства...
Я представляю как-то так:
Код
class object{
    public:
        int  Type;
        string       Name;
        Data<T>  Data;
                        Object();
                        ~Object();
        void         setData(Data<T>  Data);
};
Название: Re: си плюс плюс
Отправлено: LanuHum от 31 Октябрь 2016, 18:58:30
Вот, кажется нашёл в одном из накачанных примеров рейтрейсеров про наследников и то, как это делается

Object.h

Код
#ifndef __OBJECT_H
#define __OBJECT_H

#include <vector>
#include "IntersectData.h"
#include "Vector.h"
#include "Material.h"
#include "Ray.h"

enum IntersectType {
    HIT, MISS
};

class Object {
public:
    Point3                  position;
    Material *              material;
//    ObjectTransformer       transformer;

    // object hierarchy can have multiple children but just one parent
    // each child has coordinates relative to the parent's object space axes.
    std::vector<Object*>    children;
    Object *                parent;

                            Object();
    virtual                 ~Object();
    virtual Vector3         getNormalAt(const Point3 &p) const = 0;
    virtual IntersectType   intersect(const Ray &ray, IntersectData *data) const = 0;
    virtual void            computeBoundingBox() = 0;

    virtual void            rotate(const Vector3 &axis, float radians);
};

#endif

Mesh.h

Код
#ifndef __MESH_H
#define __MESH_H

#include "IntersectData.h"
#include "Triangle.h"
#include "Ray.h"
#include "Vector.h"
#include <vector>

class Mesh : public Object {
public:
    std::vector<Vector3*>   vertices;
    std::vector<Vector3*>   normals;

                            Mesh();
                            Mesh(const Point3 &pos);
                            ~Mesh();

    Point3                  bboxMin;
    Point3                  bboxMax;

    void                    addVertex(float x, float y, float z);
    void                    addNormal(float x, float y, float z);

    virtual IntersectType   intersect(const Ray &ray, IntersectData *data) const;
    virtual Vector3         getNormalAt(const Point3 &p) const;
    virtual void            computeBoundingBox();
    virtual void            rotate(const Vector3 &axis, float radians);
};
#endif

scene.cpp

Код
void Scene::teapot() {
    Color white = Color(1,1,1);
    Color purple = Color(0.75, 0, 0.75);

    Plane *plane = new Plane(Point3(0, -2, 0), Vector3(0, 1, 0));
    plane->material->color = purple;

    Mesh *mesh = new Mesh(Point3(0,0,0));
    mesh->material->color = white;
    Util::loadObj("meshes/teapot.obj", mesh);
    calculateBbox(mesh);

    //mesh->rotate(Vector3(1,0,0), 3.141592/4.0f);
    //rotateX(*mesh, 3.141592/4.0f);

    objects.push_back(dynamic_cast<Object*>(mesh));
    objects.push_back(dynamic_cast<Object*>(plane));
   
    m = mesh;
}
Часто нахожу ответы здесь:
http://alenacpp.blogspot.ru/2005/08/c.html
Цитата оттуда:
Цитировать
Приведение типов в C плюс плюс

Лучшая практика по приведению типов: не делать этого.
Потому что, если в программе потребовалось приведение типов,
значит в этой программе с большой долей вероятности что-то неладно.
Для довольно редких ситуаций, когда это все-таки действительно нужно,
есть четыре способа приведения типов.

Третий:
dynamic_cast
Безопасное приведение по иерархии наследования, в том числе и для виртуального наследования.
dynamic_cast<derv_class *>(base_class_ptr_expr)
Используется RTTI (Runtime Type Information), чтобы привести один указатель на объект класса к другому указателю на объект класса.
Классы должны быть полиморфными, то есть в базовом классе должна быть хотя бы одна виртуальная функция.
Если эти условие не соблюдено, ошибка возникнет на этапе компиляции.
Если приведение невозможно, то об этом станет ясно только на этапе выполнения программы и будет возвращен NULL.
dynamic_cast<derv_class &>(base_class_ref_expr)
Работа со ссылками происходит почти как с указателями, но в случае ошибки во время исполнения будет выброшено исключение bad_cast.
Название: Re: си плюс плюс
Отправлено: Striver от 31 Октябрь 2016, 19:26:19
Тогда в массиве можно будет содержать только объекты типа BlenderObject. Разнородные объекты в один класс можно загнать, но это будет неудобно. Впрочем, в построении иерархий классов тоже мало удобства...
Я представляю как-то так:
Код
class object{
    public:
        int  Type;
        string       Name;
        Data<T>  Data;
                        Object();
                        ~Object();
        void         setData(Data<T>  Data);
};

А что такое у тебя будет <T>  ? Классы с разными типами вместо  <T> будут существенно разными типами, и в один массив их нельзя будет пихать. Так что если хочешь попытаться не использовать наследование и виртуальные функции (и нафига тогда С++, можно просто С), то тебе в данные-члены нужно загнать ВСЁ, что могло бы понадобиться в потомках этого Object, а потом использовать или игнорировать часть из них.
Название: Re: си плюс плюс
Отправлено: LanuHum от 31 Октябрь 2016, 19:48:52
Тогда в массиве можно будет содержать только объекты типа BlenderObject. Разнородные объекты в один класс можно загнать, но это будет неудобно. Впрочем, в построении иерархий классов тоже мало удобства...
Я представляю как-то так:
Код
class object{
    public:
        int  Type;
        string       Name;
        Data<T>  Data;
                        Object();
                        ~Object();
        void         setData(Data<T>  Data);
};

А что такое у тебя будет <T>  ? Классы с разными типами вместо  <T> будут существенно разными типами, и в один массив их нельзя будет пихать. Так что если хочешь попытаться не использовать наследование и виртуальные функции (и нафига тогда С++, можно просто С), то тебе в данные-члены нужно загнать ВСЁ, что могло бы понадобиться в потомках этого Object, а потом использовать или игнорировать часть из них.
Ну, во-первых, я хотел было попытаться уйти от виртуальных функций в рамках С++, пытаясь найти равноценное решение, но раз ты утверждаешь, что с шаблоном я заблуждаюсь, то буду курить dinamic_cast. Просто я читал, что шаблоны применяются там, где заранее неизвестно, какого типа будет содержимое, и подумал неверно. Спасибо, что растолковал! :)
Во-вторых, С++ я выбрал, так как очень хотел портировать джавовский код рейтрейсера, а там почти С++. Тулкиты на плюсах, поврей на плюсах, яфа на плюсах. Было желание когда-то (...или от безысходности бытия...) позаимствовать то оттуда, то отсюда нужное и лучшее. На си без плюсов я только блендер интернал рендер видел... :)
Название: Re: си плюс плюс
Отправлено: Striver от 31 Октябрь 2016, 19:52:56
Цитировать
Вот, кажется нашёл в одном из накачанных примеров рейтрейсеров про наследников и то, как это делается
...

Код
    objects.push_back(dynamic_cast<Object*>(mesh));
    objects.push_back(dynamic_cast<Object*>(plane));
Я тебе примерно это и толковал...

Но тут мои собственные знания и заканчиваются, к сожалению. Мне непонятно, как этот рейтрейсер, работая с массивом objects понимает, где тут Mesh, где Plane, и т.д., и, самое главное, как к ним применять функции, специфичные для этих разных классов? Я представляю себе такую возможность только через собственные виртуальные функции (здесь это intersect, computeBoundingBox, getNormalAt и rotate), а вот где-то извне... Ну разве что бесконечно длинные простыни со switch-case (терпеть их не могу).
Поищи там пример такого разбора.
Название: Re: си плюс плюс
Отправлено: LanuHum от 31 Октябрь 2016, 20:14:03
Цитировать
Вот, кажется нашёл в одном из накачанных примеров рейтрейсеров про наследников и то, как это делается
...

Код
    objects.push_back(dynamic_cast<Object*>(mesh));
    objects.push_back(dynamic_cast<Object*>(plane));
Я тебе примерно это и толковал...

Но тут мои собственные знания и заканчиваются, к сожалению. Мне непонятно, как этот рейтрейсер, работая с массивом objects понимает, где тут Mesh, где Plane, и т.д., и, самое главное, как к ним применять функции, специфичные для этих разных классов? Я представляю себе такую возможность только через собственные виртуальные функции (здесь это intersect, computeBoundingBox, getNormalAt и rotate), а вот где-то извне... Ну разве что бесконечно длинные простыни со switch-case (терпеть их не могу).
Поищи там пример такого разбора.
Кажись, нашёл. Всё очень просто в рамках рейтрейсера. Это ж виртуальные функции, содержимое которых разное, и написано оно для каждого типа отдельно. Ему, просто, не нужно знать: меш это или плоскость.
Код
for (int i = 0, i < objects.size(); i  ){
    Object* RtObject = objects[i];
    RtObject -> computeBoundingBox();}
Теперь проясняется о чём sungreen толковал про get_type. Запрашиваем тип и используем switch...

Вот, глянь mesh.cpp
Код
#include "Mesh.h"
#include <iostream>

Mesh::Mesh() {
    position = Point3(0,0,0);
}

Mesh::Mesh(const Point3 &pos) {
    position = pos;
}

Mesh::~Mesh() {
    // TODO: stub
}

void Mesh::addVertex(float x, float y, float z) {
    vertices.push_back(new Vector3(x, y, z));
}

void Mesh::addNormal(float x, float y, float z) {
    normals.push_back(new Vector3(x, y, z));
}

void swap(float &a, float &b) {
    float temp = a;
    a = b;
    b = temp;
}

IntersectType intersectBbox(const Ray &r, const Mesh *m) {
    float tmin = (m->bboxMin.x - r.position.x) / r.direction.x;
    float tmax = (m->bboxMax.x - r.position.x) / r.direction.x;
    float tymin = (m->bboxMin.y - r.position.y) / r.direction.y;
    float tymax = (m->bboxMax.y - r.position.y) / r.direction.y;
    float tzmin = (m->bboxMin.z - r.position.z) / r.direction.z;
    float tzmax = (m->bboxMax.z - r.position.z) / r.direction.z;
    if(tmin > tmax) swap(tmin, tmax);
    if(tymin > tymax) swap(tymin, tymax);
    if((tmin > tymax) || (tymin > tmax))
        return MISS;
    if(tymin > tmin)
        tmin = tymin;
    if(tymax < tmax)
        tmax = tymax;
    if(tzmin > tzmax) swap(tzmin, tzmax);
    if((tmin > tzmax) || (tzmin > tmax))
        return MISS;
    if(tzmin > tmin) {
        tmin = tzmin;
    }
    if(tzmax < tmax) {
        tmax = tzmax;
    }
    return HIT;
}

IntersectType Mesh::intersect(const Ray &ray, IntersectData *data) const {
    if(intersectBbox(ray, this) == MISS) {
        return MISS;
    }

    int closestTriangleIndex = 0;
    float closestDistance = data->t;

    bool retval = false;
    for(int i = 0; i < normals.size();   i) {
        //Vector3 normal = *normals[i];
        Triangle triangle(*vertices[i*3], *vertices[i*3 1], *vertices[i*3 2]);
        triangle.intersect(ray, &(*data));
        if(data->t < closestDistance) {
            closestTriangleIndex = i;
            closestDistance = data->t;
            retval = true;
        }
    }

    if(retval) {
        Triangle triangle(*vertices[closestTriangleIndex*3], *vertices[closestTriangleIndex*3 1], *vertices[closestTriangleIndex*3 2]);
        return triangle.intersect(ray, &(*data));
    } else {
        return MISS;
    }
    return MISS;
}

Vector3 Mesh::getNormalAt(const Point3 &p) const {
    // TODO: fixme
    return Vector3(0,0,0);
}

void Mesh::computeBoundingBox() {
    // TODO
}



void Mesh::rotate(const Vector3 &n, const float theta) {
    float a = n.x*n.x*(1 - cos(theta))       cos(theta);
    float b = n.x*n.y*(1 - cos(theta))   n.z*sin(theta);
    float c = n.x*n.z*(1 - cos(theta)) - n.y*sin(theta);
   
    float d = n.x*n.y*(1 - cos(theta)) - n.z*sin(theta);
    float e = n.y*n.y*(1 - cos(theta))       cos(theta);
    float f = n.y*n.z*(1 - cos(theta))   n.x*sin(theta);

    float g = n.x*n.z*(1 - cos(theta))   n.y*sin(theta);
    float h = n.y*n.z*(1 - cos(theta)) - n.x*sin(theta);
    float i = n.z*n.z*(1 - cos(theta))       cos(theta);

    Matrix33 R(a,b,c,d,e,f,g,h,i);

    for(int i = 0; i < vertices.size(); i  ) {
        Vector3 &v = *vertices[i];
        *vertices[i] = v*R;
    }

    for(int i = 0; i < normals.size(); i  ) {
        Vector3 &v = *normals[i];
        *normals[i] = v*R;
                     
                     
    }
}             
Название: Re: си плюс плюс
Отправлено: LanuHum от 31 Октябрь 2016, 23:19:02
с getType() получилось, а вот данные извлекать не получается. Необходимы виртуальные функции getData() для BlenderObject и для BlenderMesh.
Нужно думать. ???
Название: Re: си плюс плюс
Отправлено: sungreen от 01 Ноябрь 2016, 05:52:22
>> функции getData() для BlenderObject и для BlenderMesh.
... для быстрого доступа к свойствам и методам, наверное будет уместным использовать приведение типов ...
... то есть, нужно разобраться как от BlenderMesh* перейти к BlenderObject* ...
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%B0
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 16:56:36
>> функции getData() для BlenderObject и для BlenderMesh.
... для быстрого доступа к свойствам и методам, наверное будет уместным использовать приведение типов ...
... то есть, нужно разобраться как от BlenderMesh* перейти к BlenderObject* ...
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%B0
Ну, так я ж и использовал приведение типов для getType().
Код
void BlenderScene::addMesh(std::string name,BlenderMesh* mesh){
    BlenderObject *obj = dynamic_cast<BlenderObject*>(mesh);
    objects.insert ( pair<std::string,BlenderObject*>(name,obj) );
}
Просто, я предполагал, что получив тип, я могу обращаться к объекту как к мешу, но, оказалось, это ни так. Но, получается совсем здорово, мне не нужно писать getData(), мне нужно писать виртуальную функцию создания объекта сразу на месте. Это будет круто.

Вот это неверное решение:

Код
int BlenderScene::addObjectToPovray(std::string name){
    BlenderObject *bobject = objects.find(name) -> second;
    if (!bobject)
        return 0;
    int obj_type = bobject -> getType();
    switch (obj_type) {
        case 2: {
            Mesh *mesh = new Mesh();  // create Povray Mesh
            mesh -> vertex_vectors = bobject -> vertex_vectors;
            break;
        }
        case 1: {}
        default: {}
    }
    return 1;
}

Надеюсь, что это верное:

Код
void BlenderScene::addObjectToPovray(std::string name){
    BlenderObject *bobject = objects.find(name) -> second;
    bobject -> createPovrayObject();
}

Виртуальная функция createPovrayObject() будет написана и в BlenderObject.h, и для BlenderMesh.h, и для BlenderBlob.h, и для BlenderBoolean.h, но тело функции в соответствующих файлах .cpp будет индивидуальным.
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 17:43:19
Писдец... я вобще не понимаю, как можно что-то серьёзное программировать без знания того, как организована память в компутере... и почему есть целые переменные, а есть вещественные... и т.д., и т.п... Ланухумыч, ты уникален! :)
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 18:23:16
Писдец... я вобще не понимаю
Ты тупой. :)  В C++ не нужно управлять памятью вручную, это тебе не С. Памятью управляют вручную, когда создают указатели.
Object *samovar = new Object();
delete samovar;
delete освобождает память занятую объектом samovar, который мы создали для определённых целей и достигли этих целей.
Сколько тебе показать подобных картинок, чтоб ты не выдавал желаемое за действительное?

Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 18:25:04
Цитировать
Ты тупой. :)
Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть :)
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 18:32:38
Цитировать
Ты тупой. :)
Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть :)
Суть проста: мне нужна программа, и, я её напишу независимо от твоего мнения ;D
Программа будет работать корректно. :)
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 18:37:14
Цитировать
Ты тупой. :)
Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть :)
Суть проста: мне нужна программа, и, я её напишу независимо от твоего мнения ;D
Программа будет работать корректно. :)
да я буду рад этому :) но ещё раз тебе напишу: пока ты не  врубишься в машинный код и ассемблер во взаимосвязи с СИ++, твои проги будут работать, но иногда тупить и тормозить...
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 18:52:43
да я буду рад этому :) но ещё раз тебе напишу: пока ты не  врубишься в машинный код и ассемблер во взаимосвязи с СИ++, твои проги будут работать, но иногда тупить и тормозить...
Точно тупой ты. :) А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?
Да, социалистическая идеология у тебя в генах, и, ты не догоняешь, как можно вразрез с политикой парии и правительства что-то делать...
Тот у тебя картинки не по твоему рисует, этот программирует не по твоему. Но, есть мнения, отличные от твоих, и, эти мнения есть у матёрых программистов, обучающих людей тем манерам, которые приемлемы здесь и сейчас. Не знаю я, почему у тебя ни DOS, и, почему ты сообщение мне пишешь ни на ассемблере, хотя и хорошо с ним знаком.
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 18:58:12

Цитировать
Точно тупой ты. :) А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?
LanuHum, ты извини, но ты дурень великовозрастный... этому в конце 80-х и начале 90-х школьников в средней школе учили... ты книжки открой, врубись  что такое бит, байт, слово, двойное слово... мантисса и порядок...
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 19:21:53

Цитировать
Точно тупой ты. :) А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?
LanuHum, ты извини, но ты дурень великовозрастный... этому в конце 80-х и начале 90-х школьников в средней школе учили... ты книжки открой, врубись  что такое бит, байт, слово, двойное слово... мантисса и порядок...

Хорошо, допустим, я выучил наизусть эту страницу:
https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82
Эту:
https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82
Как знание об этом поможет мне заставить рендерер брать данные не из файла, а из интерпретатора Python? Не будем забывать, что рендерер и интерпретатор уже написаны профессионалами. Объясняй, я ж тупой, но, хочу понять. Только не нужно деклараций, доходчиво, по теме. Вообще, давай от печки. Я начну за тебя.
- Ланухумыч, ты хочешь заставить рендерер брать данные не из файла, а из интерпретатора Python? Без знания о логических состояниях в триггерах никак этого не достичь...
Продолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...
или не хочешь, чтобы я делал то, что делаю, так как когда-то мне про конкуренцию пел арию Лазаря...
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 19:27:15
Цитировать
Продолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...
Если честно, то и то, и другое:)  если действительно хочешь разобраться, то у парней , которые тебе советы пишут спроси, они в курсе :) ...
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 19:41:06
Цитировать
Продолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...
Если честно, то и то, и другое:)  если действительно хочешь разобраться, то у парней , которые тебе советы пишут спроси, они в курсе :) ...
Действительно, я хочу, чтоб мне помогали, когда я спрашиваю...ну, или хотя бы молчали, если нет желания помочь. :)
Никто из тех программистов, кто мне советы пишет, не советует мне начинать с изучения ассемблера. Просто, есть программисты, которые мне совсем ничем не обязаны. К таким я обращаюсь в самом крайнем случае по электронной почте. Здесь мне тоже никто ничем не обязан, но, здесь мои вопросы не противоречат идеям форума.
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 19:43:38
ладно... давай так...
Чем является "указатель" в языке Си?

Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 19:52:26
ладно... давай так...
Чем является "указатель" в языке Си?
Указатель является числом (по-моему, шестнадцатеричной системы исчисления), указывающим на ячейку памяти, которую я занял, создав переменную.
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 19:57:48
ладно... давай так...
Чем является "указатель" в языке Си?
Указатель является числом (по-моему, шестнадцатеричной системы исчисления), указывающим на ячейку памяти, которую я занял, создав переменную.
почти попал :) указатель   является адресом НАЧАЛЬНОЙ ячейки памяти в которой что-то хранится... но блин, непонятно чито тамо хранится, т.к. одна ячейка памяти - это один байт, но дальше идут другие байты... потому указывается тип ( размерность переменной... или сколько следующих байт используется)... ясно? ...там может хранится и адрес функции  (подпрограммы) в памяти... да и пофиг что :)  ...Архитектура фон Неймана —принцип совместного хранения команд и данных в памяти компьютера. Знаешь что прикольно, что ты этот мусор из данных (переменных) тоже можешь запустить, оперируя в машинном коде... можешь сделать самомодифицируемый код (прогу, которая сама себя "пишет" и исполняет)... врубайся :) надеюсь, всё-таки я до тебя достучался....
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 20:17:53
ладно... давай так...
Чем является "указатель" в языке Си?
Указатель является числом (по-моему, шестнадцатеричной системы исчисления), указывающим на ячейку памяти, которую я занял, создав переменную.
почти попал :) указатель   является адресом НАЧАЛЬНОЙ ячейки памяти в которой что-то хранится... но блин, непонятно чито тамо хранится, т.к. одна ячейка памяти - это один байт, но дальше идут другие байты... потому указывается тип ( размерность переменной... или сколько следующих байт используется)... ясно? ...там может хранится и адрес функции  (подпрограммы)в памяти... да и пофиг что :)
Мне ясно, что char - 1, short - 2, int - 4, double - 8. Если создаём массив, указываем число объектов и тип. Умножаем, получаем.
sizeof выдаёт размер. sizeof(float), sizeof(long long)...
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 20:23:53
ну и что ты думаешь делает компилятор Си, когда ты написал функцию и обозвал её?
он просто пишет в машинном коде:
Call [адрес функции в памяти]
...в натуральном машинном коде глупо писать, достаточно ассемблерной мнемоники :)
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 20:31:33
ну и что ты думаешь делает компилятор Си, когда ты написал функцию и обозвал её?
он просто пишет в машинном коде:
Call [адрес функции в памяти]
 :)
Ой! Я об этом даже не догадывался! :)
Ну, дальше...
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 20:37:07
Ну а дальше   у проца есть регистры...
Регистр IP (счётчик команд) указывает на адрес в памяти, где лежит команда к процессору... и ещё есть стэк :) тамо хранятсо все локальные переменные функций...

Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 20:41:53
Ну а дальше   у проца есть регистры...
Регистр IP (счётчик команд) указывает на адрес в памяти, где лежит команда к процессору... и ещё есть стэк :) тамо хранятсо все локальные переменные функций...
Это то, что поможет мне заставить рендерер брать данные не из файла, а из интерпретатора Python?
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 20:44:47
 Python - интерпретатор , т.е. набор подпрограмм (читай лажа по скорости), он  не сможет быстро работать никогда...
читай данные из файла... лучше бинарника... меньше объём, соответственно, быстрее доступ... но если сможешь, то лучше читай напрямую из памяти- это наилучший вариант :)
и если действительно хочешь, чтобы было быстро, то изучи ассемблер - это родной язык процов, хотя, увы достаточно трудносовместимый... хотя, компиляторы Ст чё-та пырхаются... но не всегда удачно :)
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 20:59:43
Python - интерпретатор , т.е. набор подпрограмм (читай лажа по скорости), он  не сможет быстро работать никогда...
Это тут каким боком? Блендер использует питон для создания файла сцены посредством скрипта экспорта, стало быть это факт, от которого нам не уйти никуда. Хотим мы или нет, но без питона, не влезая в код самого блендера, файл сцены мы не создадим ни для люкса, ни для яфы, ни для поврея, ни для кого, вообще. Но, если мы посмотрим правильно, то увидим, что время отнимает у нас ни столько питон, сколько сама запись в файл, как и вывод в консоль. Даже на С программа считает 100 миллисекунд, а, если захотим видеть результат в консоли, то уйдёт минута, три, пять...
Другая сторона медали - парсер. Бесконечные сравнения, приведения... Одно дело объявить а = 10, другое дело перебрать сто условий в конце которых таки выяснится, что а = 10...
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 21:04:33
Python - интерпретатор , т.е. набор подпрограмм (читай лажа по скорости), он  не сможет быстро работать никогда...
Это тут каким боком? Блендер использует питон для создания файла сцены посредством скрипта экспорта, стало быть это факт, от которого нам не уйти никуда. Хотим мы или нет, но без питона, не влезая в код самого блендера, файл сцены мы не создадим ни для люкса, ни для яфы, ни для поврея, ни для кого, вообще. Но, если мы посмотрим правильно, то увидим, что время отнимает у нас ни столько питон, сколько сама запись в файл, как и вывод в консоль. Даже на С программа считает 100 миллисекунд, а, если захотим видеть результат в консоли, то уйдёт минута, три, пять...
Другая сторона медали - парсер. Бесконечные сравнения, приведения... Одно дело объявить а = 10, другое дело перебрать сто условий в конце которых таки выяснится, что а = 10...
нахрена тебе экспортировать сцену куда-то, тратя на это время и память, если ты можешь читать blend-файл из памяти?
да, это сложно... но это наиболее эффективно и быстро....
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 21:12:31
но если сможешь, то лучше читай напрямую из памяти- это наилучший вариант :)
Так я ж это и делаю. Только, чтобы что-то прочитать из памяти, туда нужно сначала положить что-то. Блендера сцену в память может положить только интерпретатор питона. Ты ж раззуй глаза, я не использую бинарник блендера, я использую сборку блендера как сишный питон-модуль. Из С++ я даю команду загрузить сцену в память:
pyResult = PyObject_CallObject(pyFunc, pyArgs);
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 21:19:22
Python - интерпретатор , т.е. набор подпрограмм (читай лажа по скорости), он  не сможет быстро работать никогда...
Это тут каким боком? Блендер использует питон для создания файла сцены посредством скрипта экспорта, стало быть это факт, от которого нам не уйти никуда. Хотим мы или нет, но без питона, не влезая в код самого блендера, файл сцены мы не создадим ни для люкса, ни для яфы, ни для поврея, ни для кого, вообще. Но, если мы посмотрим правильно, то увидим, что время отнимает у нас ни столько питон, сколько сама запись в файл, как и вывод в консоль. Даже на С программа считает 100 миллисекунд, а, если захотим видеть результат в консоли, то уйдёт минута, три, пять...
Другая сторона медали - парсер. Бесконечные сравнения, приведения... Одно дело объявить а = 10, другое дело перебрать сто условий в конце которых таки выяснится, что а = 10...
нахрена тебе экспортировать сцену куда-то, тратя на это время и память, если ты можешь читать blend-файл из памяти?
да, это сложно... но это наиболее эффективно и быстро....
Да, нахера мне твой файл? В нём есть все вычисления деформаций в каждом кадре? В файле только ключи, на основании которых блендер считает деформации в каждом кадре. Или ты предлагаешь мне перенести из кода блендера все алгоритмы вычислений?
Считая анимацию в 1000 кадров, я только раз загружаю всю сцену, затем грузятся только объекты, к которым применены деформаторы сетки: кости, ключи вершин, кривые анимированные, решётки, всё что перемещает вершины относительно матрицы...
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 21:20:29
Т.е. ты тупо копируешь  данные из памяти в память, а потом ещё и в свой рендерер, расходуя её в х3  больше :) Эффективней будет читать .blend напрямую из памяти, тогда расход уменьшится до х2, но это сложно...
Цитировать
Или ты предлагаешь мне перенести из кода блендера все алгоритмы вычислений?
тебе из кода бленд-файла нужны только те данные, которые поддерживает твой рендер... если он не поддерживает модификаторы, то  их придётся схлопнуть, или написать их аналоги, или юзать тормознутый Python... х.з. по идее, в рендер должна покадрово идти только ФИНАЛЬНАЯ сетка с материалами, камера и ИС, а не её модификаторы...
хочешь скорости, озадачься проблемами...
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 21:51:28
Т.е. ты тупо копируешь  данные из памяти в память, а потом ещё и в свой рендерер, расходуя её в х3  больше :) Эффективней будет читать .blend напрямую из памяти, тогда расход уменьшится до х2, но это сложно...
Я загружаю в С++ модуль bpy, модуль загружает блендфайл, я даю команду передать данные первого кадра, получаю данные,
обнуляю PyObject :
 Py_XDECREF(pyResult);
Далее, в следующих кадрах анимированные объекты заменяются. Я не копирую, а преобразую, удаляя прообраз.
А, что касается рендера, то да, но это издержки всех рендеров. Рендеру не нужны индексы вершин, индексы нормалей и прочая хрень. Рендеру нужна точная информация. Это происходит и в интернале, он вычисляет на основе индексов и координат вершин все координаты каждой вершины, поэтому потребление памяти при просчёте возрастает. Если у тебя вершина принадлежит четырём фейсам, в Блендере в четырёх фейсах будет один индекс, указывающий на эту вершину. В рендере фейсы записывают все конкретные координаты вершин, иначе, как считать trace?
Здесь можно использовать два варианта: херовый комп и крутой комп. Для одного из них инфу можно сразу укладывать в форму для рейтрейсера. И, использовать указатели, не копируя.
Название: Re: си плюс плюс
Отправлено: Samovar от 01 Ноябрь 2016, 21:58:08
Ладно, Ланухумыч, извини за дерзость... я не вполне шарю, о чём ты... если тебе нет дела до того, что я к тебе пишу, то и не придавай значения.
У меня к  тебе просьба помочь (написать дополнение), если сможешь, и когда у тебя будет время... завтра подробно напишу в личку.
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 22:09:01
или юзать тормознутый Python...
Да, в разумных пределах он тормознутый. За 28 секунд у меня создаётся BlenderMesh в 3 000 000 треугольников. Сколько понадобится на преобразование его в PovrayMesh я не знаю ещё, но предполагаю секунд 5, да хоть и 28 ещё - меньше минуты. Сейчас вот запустил обычный вариант, 7 минут подготовка к рендеру. Разница в шесть минут для анимации - уже хороший прирост в экономии времени.
Название: Re: си плюс плюс
Отправлено: LanuHum от 01 Ноябрь 2016, 22:13:45
Ладно, Ланухумыч, извини за дерзость... я не вполне шарю, о чём ты... если тебе нет дела до того, что я к тебе пишу, то и не придавай значения.
У меня к  тебе просьба помочь (написать дополнение), если сможешь, и когда у тебя будет время... завтра подробно напишу в личку.
Может, ты и правильно советуешь, но не такому программисту как я. Имей я достаточное количество времени...
Пиши в личку про дополнение. Мне полезно отвлекаться на более знакомые дела. Хотя и знакомые дела бывают не знакомыми. :)