OSG 학습 노트 2 - 노드 속성 접근 기

3961 단어
osgStudy4_20. cpp: 콘 솔 프로그램의 입구 점 을 정의 합 니 다.
노드 속성 접근 기
NodeVisitor 를 사용자 정의 하고 노드 접근 에 사용 하 는 방법 으로 중요 한 apply () 가상 함 수 를 재 구성 합 니 다. 그 중에서 노드 의 속성 정보 (이름과 소재 라 이브 러 리) 를 인쇄 하고 적당 한 들 여 쓰기 를 통 해 전체 노드 트 리 의 차원 구 조 를 표현 합 니 다.
방문 기 Visitor 는 전형 적 인 대상 행위 모델 을 사용 하여 서로 다른 노드 에 사용자 정의 조작 을 가 할 수 있 습 니 다. 이 조작 을 한 대상 에 통합 시 키 는 동시에 이러한 조작 으로 인해 발생 할 수 있 는 데이터 구조 자체 의 변 화 를 피 함으로써 더욱 자유로운 인 코딩 방식 을 실현 할 수 있 습 니 다.
모든 데이터 요소 노드 는 accept () 방법 으로 액세스 기 를 호출 할 수 있 습 니 다. 액세스 기 는 apply () 방법 으로 들 어 오 는 노드 대상 을 가 져 오고 필요 한 노드 작업 을 수행 할 수 있 습 니 다.
osg:: NodeVisitor 는 방문 자 역할 의 추상 적 인 인터페이스 일 뿐 입 니 다.여기 인 터 페 이 스 는 C + + 표준 정의 인터페이스 가 아니 라 소스 코드 를 보 았 습 니 다. NodeVisitor 에서 서로 다른 노드 의 apply 가상 함 수 를 정의 합 니 다. 사용자 정의 Visitor 하위 클래스 의 재 작성 에 사용 되 는 것 은 순 허 함수 가 아 닙 니 다. 여기 책 은 인터페이스 라 고 하 는데 이해 하기 위해 서 입 니 다. / -C + 구조 함수 초기 값 목록 -
//InfoVisitor():osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0){}
/ / 구조 함수 초기 화 목록.C++Primer5 P258
/ / 구조 함수 의 초기 값 목록 에서 명시 적 초기 화 구성원 이 없 으 면 이 구성원 은 구조 함수 체 를 만 들 기 전에 기본 초기 화 를 실행 하 는 것 이 일반적인 구조 함수 쓰기 입 니 다.
/ / 그러나 일부 데이터 구성원 은 초기 화 되 어야 합 니 다. 예 를 들 어 const 나 참조, 구성원 이 특정한 종류 에 속 하고 이 클래스 가 기본 구조 함 수 를 정의 하지 않 았 을 때 이 구성원 을 초기 화 해 야 합 니 다.
/ / 제안: 구조 함수 의 초기 값 을 사용 하 는 습관 을 기 르 면 컴 파일 오 류 를 피 할 수 있 습 니 다.
/ / 구조 함수 이름 InfoVisitor () 뒤의 ":" 뒤에 두 개의 초기 화 값 이 있 고 쉼표 로 구분 합 니 다.이전 에는 InfoVisitor 라 는 클래스 가 NodeVisitor 를 물 려 받 았 기 때 문 일 것 입 니 다.
/ / 여기 서 동시에 부 류 를 초기 화 합 니 다.두 번 째 는indent 를 0 으로 초기 화 합 니 다.
/ / - C + + 인터페이스 --
다른 시스템 과 상호작용 하 는 방법 을 제공 하고 모든 하위 클래스 에 접근 인 터 페 이 스 를 공동으로 약정 합 니 다. 클래스 밖에서 사용 하 는 인 터 페 이 스 는 일반적으로 순수한 가상 함 수 를 사용 합 니 다. 예 를 들 어 virtual void work () = 0;
인터페이스 실현: 인 터 페 이 스 를 계승 하 는 하위 클래스 를 통 해 서로 다른 하위 클래스 는 서로 다른 효 과 를 실현 할 수 있다. 이것 이 바로 다 형 이다.
/ - C + + 허 함수 - - / 기 류 는 유형 과 관련 된 함수 와 파생 류 를 바 꾸 지 않 고 직접 계승 하 는 함수 와 구별 합 니 다.일부 함수 에 대해 기본 클래스 는 파생 클래스 가 자신 에 게 맞 는 버 전 을 사용자 정의 하 기 를 바 랍 니 다. 이때
/ / 기본 클래스 는 이 함수 들 을 가상 함수 virtual 로 설명 합 니 다. 즉, 설명 은 덮어 쓸 수 있 습 니 다.하위 클래스 의 두 apply 는 부 류 를 재 구성 하 는 방법 이다.
/ / C + + 는 한 구성원 함수 가 가상 함수 로 밝 혀 지면 파생 클래스 의 동명 함수 가 자동 으로 가상 함수 가 되 므 로 하위 클래스 가 이 가상 함 수 를 다시 설명 할 때 virtual 키 워드 를 추가 할 수도 있 고 추가 하지 않 아 도 되 지만 더 하면 프로그램 차원 이 더욱 뚜렷 해 집 니 다.
#include "stdafx.h"
#include<osg/Node>
#include<osgDB/ReadFile>
#include<iostream>


class InfoVisitor :public osg::NodeVisitor{//Step1:            
public:
	InfoVisitor()
	:osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0){}


	virtual void apply(osg::Node& node)//Step2:           apply()  ,           。
	{
		for (int i = 0; i < _indent; ++i) std::cout << " ";
		std::cout << "[" << _indent + 1 << "]" << node.libraryName() << "::" << node.className() << std::endl;


		_indent++;
		traverse(node);
		_indent--;
	}
	virtual void apply(osg::Geode& node)
	{
		for (int i = 0; i < _indent; ++i) std::cout << " ";
		std::cout << "[" << _indent + 1 << "]" << node.libraryName() << "::" << node.className() << std::endl;


		for (unsigned int n = 0; n < node.getNumDrawables(); ++n)
		{
			osg::Drawable*drawable = node.getDrawable(n);
			if (!drawable)continue;


			for (int i = 0; i <= _indent; ++i)std::cout << " ";
			std::cout << drawable->libraryName() << "::" << drawable->className() << std::endl;
		}
		_indent++;
		traverse(node);
		_indent--;
	}
protected:
	int _indent;
};
int _tmain(int argc, char** argv)
{
	osg::ArgumentParser arugments(&argc, argv);
	osg::Node* root = osgDB::readNodeFiles(arugments);
	if (!root) root = osgDB::readNodeFile("axes.osgt");


	InfoVisitor infoVisitor;
	if (root)root->accept(infoVisitor);//Step3:         , accept()         apply()




	return 0;
}

좋은 웹페이지 즐겨찾기