Пытался: error: 'class povanim::BlenderObject' has no member named 'name'
>> и пишу его в 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 которая возвращает код типа объекта ...
-- 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/buildScanning 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
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;}
Не конпеляется. Пиши еще . А если серьезно, то даже в твоем простом коде я уже ноги сломал. Объясни словами, что от чего хочешь наследовать или что там? Может и я пойму что.
ЦитироватьКласс "объект", его потомки: "меш", "кривая". Меши и кривые нужно вогнать в один массив, что ни так страшно, как потом их оттуда извлечь.Вот из-за подобной хрени меня бесят языки со статической типизацией... В питоне такой проблемы нет, и можно даже иерархии классов не строить.
Класс "объект", его потомки: "меш", "кривая". Меши и кривые нужно вогнать в один массив, что ни так страшно, как потом их оттуда извлечь.
Почему ты выбрал Fox, а не Qt например?
Допустим, у меня есть данные для меша, в данном случае имя. Что мне делать? Я делаю так:BlenderMesh *mesh = new BlenderMesh();mesh -> name = obname;Так как меш наследник объекта, я и пишу его в map, как объект... понимаю, что, скорее всего, это неверно, и это первый повод материться.Как мне превратить меш в объект?
Например, такКод: [Выделить]BlenderObject *mesh = new BlenderMesh();
mesh -> name = obname;
class BlenderObject{...virtual SuperFunction();...};
class BlenderMesh{...virtual SuperFunction();...};
mesh -> SuperFunction();
this.name = obname;
Ну так и объяви name в объекте, а не в меше.
говорит, что этот GUI быстрее... но мне до сих пор непонятно, почему он начинает свои проги с обёртки, а не с начинки...
...
Я попробую без наследников.
Ладно, 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;};
Тогда в массиве можно будет содержать только объекты типа BlenderObject. Разнородные объекты в один класс можно загнать, но это будет неудобно. Впрочем, в построении иерархий классов тоже мало удобства...
class object{ public: int Type; string Name; Data<T> Data; Object(); ~Object(); void setData(Data<T> Data);};
#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
#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
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;}
Приведение типов в 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.
Цитата: Striver от 31 Октябрь 2016, 18:28:39Тогда в массиве можно будет содержать только объекты типа BlenderObject. Разнородные объекты в один класс можно загнать, но это будет неудобно. Впрочем, в построении иерархий классов тоже мало удобства...Я представляю как-то так:Кодclass object{ public: int Type; string Name; Data<T> Data; Object(); ~Object(); void setData(Data<T> Data);};
Цитата: LanuHum от 31 Октябрь 2016, 18:50:03Цитата: Striver от 31 Октябрь 2016, 18:28:39Тогда в массиве можно будет содержать только объекты типа BlenderObject. Разнородные объекты в один класс можно загнать, но это будет неудобно. Впрочем, в построении иерархий классов тоже мало удобства...Я представляю как-то так:Кодclass object{ public: int Type; string Name; Data<T> Data; Object(); ~Object(); void setData(Data<T> Data);};А что такое у тебя будет <T> ? Классы с разными типами вместо <T> будут существенно разными типами, и в один массив их нельзя будет пихать. Так что если хочешь попытаться не использовать наследование и виртуальные функции (и нафига тогда С++, можно просто С), то тебе в данные-члены нужно загнать ВСЁ, что могло бы понадобиться в потомках этого Object, а потом использовать или игнорировать часть из них.
Вот, кажется нашёл в одном из накачанных примеров рейтрейсеров про наследников и то, как это делается ...Код objects.push_back(dynamic_cast<Object*>(mesh)); objects.push_back(dynamic_cast<Object*>(plane));
objects.push_back(dynamic_cast<Object*>(mesh)); objects.push_back(dynamic_cast<Object*>(plane));