Example #1
0
void Camera::strafe_vert(float dist){
	glm::vec3 horiz = glm::cross(view_dir(), up);
	glm::vec3 vert = glm::cross(horiz, view_dir());
	eye += dist * vert;
	center += dist * vert;
	view = glm::lookAt(eye, center, up);
}
Example #2
0
void Camera::yaw(float deg){
	glm::vec3 horiz = glm::cross(view_dir(), up);
	glm::vec3 vert = glm::cross(horiz, view_dir());
	glm::mat4 rot = glm::rotate(util::deg_to_rad(deg), vert);
	glm::vec3 dir = glm::normalize(glm::vec3{rot * glm::vec4{view_dir(), 0}});
	center = eye + dir;
	view = glm::lookAt(eye, center, up);
}
Example #3
0
void Camera::pitch(float deg){
	glm::vec3 horiz = glm::cross(view_dir(), up);
	glm::mat4 rot = glm::rotate(util::deg_to_rad(deg), horiz);
	glm::vec3 dir = glm::normalize(glm::vec3{rot * glm::vec4{view_dir(), 0}});
	center = eye + dir;
	up = glm::normalize(glm::vec3{rot * glm::vec4(up, 0)});
	view = glm::lookAt(eye, center, up);
}
Example #4
0
int main()
{
    int sock;
    struct sockaddr_in server;

    char buffer[MAXBUF];
    //Создание сокета
    sock = socket(AF_INET , SOCK_STREAM , 0);
    if (sock == -1)
    {
        printf("Could not create socket");
    }
    puts("Socket created\n");

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons( 1234 );

    //Connect to remote server
    if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        perror("connect failed. Error");
        return 1;
    }

        bzero(buffer, MAXBUF);
        recv(sock , buffer , MAXBUF , 0); // прием слова
        puts(buffer);
        printf("Для получения справки введите команду help\n");
        while(1){
            bzero(buffer, MAXBUF);
            printf("Cmd: ");
            scanf("%s" , buffer);
            // команды
             if(strcmp(buffer, "view") == 0)
                    view_dir(buffer, sock, MAXBUF);
             else if(strcmp(buffer, "view_dir") == 0)
                    view_dir(buffer, sock, MAXBUF);
             else if(strcmp(buffer, "help") == 0)
                     get_help();
             else if(strcmp(buffer, "get_dir") == 0)
                    get_dir(buffer, sock, MAXBUF);
             else if(strcmp(buffer, "ch_dir") == 0)
                    ch_dir(buffer, sock, MAXBUF);
             else if(strcmp(buffer, "upload") == 0)
                    upload(buffer, MAXBUF, sock);
             else if(strcmp(buffer, "mk_dir") == 0)
                    mk_dir(buffer, MAXBUF, sock);
             else if(strcmp(buffer, "rm_dir") == 0)
                    rm_dir(buffer, MAXBUF, sock);
             else
                    printf("unknown comand\n");
             printf("Для получения справки введите команду help\n");
         }

         close(sock);
         return 0;
}
Example #5
0
MStatus PTCMapCmd::doIt( const MArgList& args)
{
    MStatus status = parseArgs( args );

    if( status != MS::kSuccess ) return status;

    MArgDatabase argData(syntax(), args);

    MAnimControl timeControl;
    MTime time = timeControl.currentTime();
    int frame =int(time.value());
    MString proj;
    MGlobal::executeCommand( MString ("string $p = `workspace -q -fn`"), proj );

    MString cache_path = proj + "/data";
    MString cache_name = "foo";
    MString cache_attrib;
    double cache_mindist = 0.1;
    int max_level = 3;
    double root_size = 32;
    MString dem_trans = "nil";
    double cloud_os = 0.05;
    MString key_trans = "nil";
    MString eye_trans = "nil";

    if (argData.isFlagSet("-p")) argData.getFlagArgument("-p", 0, cache_path);
    if (argData.isFlagSet("-n")) argData.getFlagArgument("-n", 0, cache_name);
    if (argData.isFlagSet("-a")) argData.getFlagArgument("-a", 0, cache_attrib);
    if (argData.isFlagSet("-mnd")) argData.getFlagArgument("-mnd", 0, cache_mindist);
    if (argData.isFlagSet("-ml")) argData.getFlagArgument("-ml", 0, max_level);
    if (argData.isFlagSet("-rs")) argData.getFlagArgument("-rs", 0, root_size);
    if (argData.isFlagSet("-t")) argData.getFlagArgument("-t", 0, dem_trans);
    if(argData.isFlagSet("-o")) argData.getFlagArgument("-o", 0, cloud_os);
    if(argData.isFlagSet("-tk")) argData.getFlagArgument("-tk", 0, key_trans);
    if(argData.isFlagSet("-te")) argData.getFlagArgument("-te", 0, eye_trans);

    float def_area = root_size;
    int last = 0;
    while(last < max_level-2) {
        def_area /= 2;
        last++;
    }

    def_area = 1.0f;

    //def_area *= def_area;

// get bounding box center
    MDagPath p_bbox;

    zWorks::getTypedPathByName(MFn::kTransform, dem_trans, p_bbox);
    MObject o_bbox = p_bbox.transform();

    float m_space[4][4];
    m_space[0][0]=1;
    m_space[0][1]=0;
    m_space[0][2]=0;
    m_space[1][0]=0;
    m_space[1][1]=1;
    m_space[1][2]=0;
    m_space[2][0]=0;
    m_space[2][1]=0;
    m_space[2][2]=1;
    m_space[3][0]=0;
    m_space[3][1]=0;
    m_space[3][2]=0;

    if(o_bbox.isNull()) MGlobal::displayWarning("Cannot find pmap dimension, use default space.");
    else zWorks::getTransformWorldNoScale(p_bbox.partialPathName(), m_space);

    XYZ root_center(m_space[3][0], m_space[3][1], m_space[3][2]);

// get key light dir
    MDagPath p_key;

    zWorks::getTypedPathByName(MFn::kTransform, key_trans, p_key);
    MObject o_key = p_key.transform();

    m_space[0][0]=1;
    m_space[0][1]=0;
    m_space[0][2]=0;
    m_space[1][0]=0;
    m_space[1][1]=1;
    m_space[1][2]=0;
    m_space[2][0]=0;
    m_space[2][1]=0;
    m_space[2][2]=1;
    m_space[3][0]=0;
    m_space[3][1]=0;
    m_space[3][2]=0;

    if(o_key.isNull()) MGlobal::displayWarning("Cannot find key camera, use default space.");
    else zWorks::getTransformWorldNoScale(p_key.partialPathName(), m_space);

    XYZ key_dir(m_space[2][0], m_space[2][1], m_space[2][2]);
    key_dir.normalize();

// get view dir
    MDagPath p_eye;

    zWorks::getTypedPathByName(MFn::kTransform, eye_trans, p_eye);
    MObject o_eye = p_eye.transform();

    m_space[0][0]=1;
    m_space[0][1]=0;
    m_space[0][2]=0;
    m_space[1][0]=0;
    m_space[1][1]=1;
    m_space[1][2]=0;
    m_space[2][0]=0;
    m_space[2][1]=0;
    m_space[2][2]=1;
    m_space[3][0]=0;
    m_space[3][1]=0;
    m_space[3][2]=0;

    if(o_eye.isNull()) MGlobal::displayWarning("Cannot find render camera, use default space.");
    else zWorks::getTransformWorldNoScale(p_eye.partialPathName(), m_space);

    XYZ view_dir(-m_space[2][0], -m_space[2][1], -m_space[2][2]);
    view_dir.normalize();

// additional attribs
    MStringArray attribArray;
    cache_attrib.split('.', attribArray);

    MSelectionList slist;
    MGlobal::getActiveSelectionList( slist );
    MItSelectionList list( slist, MFn::kParticle, &status );
    if (MS::kSuccess != status) {
        displayError( "Could not create selection list iterator");
        return status;
    }

    if (list.isDone()) {
        displayError( "No particles selected" );
        return MS::kSuccess;
    }

    MDagPath fDagPath;
    MObject component;
    unsigned npt = 0,acc = 0;
    for(; !list.isDone(); list.next()) {
        list.getDagPath (fDagPath, component);
        MFnParticleSystem ps( fDagPath );
        npt += ps.count();
    }

    if(npt < 1) {
        MGlobal::displayInfo(" zero particle: do nothing ");
        return MS::kSuccess;
    }

    std::list<AParticle *> particles;

    RGRID *buf = new RGRID[npt];
    unsigned *idxb = new unsigned[npt];
    float *opab = new float[npt];
    float *ageb = new float[npt];

    list.reset();
    for(; !list.isDone(); list.next()) {
        list.getDagPath (fDagPath, component);
        MFnParticleSystem ps( fDagPath );

        MVectorArray positions;
        ps.position( positions );

        MVectorArray velarr;
        ps.velocity( velarr );

        MIntArray ids;
        ps.particleIds(ids);

        MVectorArray cols;
        ps.rgb(cols);

        MDoubleArray opas;
        ps.opacity(opas);

        MDoubleArray ages;
        ps.opacity(ages);

        for(unsigned i=0; i<positions.length(); i++,acc++ ) {
            buf[acc].pos.x = positions[i].x;
            buf[acc].pos.y = positions[i].y;
            buf[acc].pos.z = positions[i].z;
            buf[acc].nor.x = velarr[i].x;
            buf[acc].nor.y = velarr[i].y;
            buf[acc].nor.z = velarr[i].z;
            buf[acc].area = def_area;

            if(ps.hasRgb()) {
                buf[acc].col.x = cols[i].x;
                buf[acc].col.y = cols[i].y;
                buf[acc].col.z = cols[i].z;
            }
            else buf[acc].col = XYZ(1,1,1);

            idxb[acc] = ids[i];

            if(ps.hasOpacity ()) opab[acc] = opas[i];
            else opab[acc] = 1.f;

            ageb[acc] = ages[i];

            AParticle *pt = new AParticle();
            pt->pos.x = positions[i].x;
            pt->pos.y = positions[i].y;
            pt->pos.z = positions[i].z;
            pt->r = def_area;

            particles.push_back(pt);
        }
    }
    /*
    	Z3DTexture* tree = new Z3DTexture();
    	tree->setGrid(buf, npt);
    	tree->constructTree(root_center, root_size, max_level);
    	tree->setGridIdData(idxb, npt);
    	tree->setGridOpacityData(opab, npt);
    	tree->setGridAgeData(ageb, npt);
    	MGlobal::displayInfo(MString(" num grid ")+ tree->getNumGrid());
    	MGlobal::displayInfo(MString(" num voxel ")+ tree->getNumVoxel());
    	MGlobal::displayInfo(MString(" num leaf ")+ tree->getNumLeaf());
    	MGlobal::displayInfo(MString(" max level ")+ tree->getMaxLevel());
    	MGlobal::displayInfo(" calculating voxel volume occlusion...");
    	tree->occlusionVolume(cloud_os, key_dir, view_dir);
    	MGlobal::displayInfo(" done");
    	MGlobal::displayInfo(" updating grid distance to neighbour...");
    	tree->distanceToNeighbour(cache_mindist);
    	MGlobal::displayInfo(" done");

    	char filename[512];
    	sprintf( filename, "%s/%s.%d.pmap", cache_path.asChar(), cache_name.asChar(), frame );
    	MGlobal::displayInfo(MString("PTCMap saved ") + filename);
    	tree->save(filename);

    	delete tree;
    	*/
    if(!particles.empty()) {
        GPUOctree *data = new GPUOctree();
        data->create(root_center, root_size, 8, particles);
        MGlobal::displayInfo(MString(" num voxel ")+ data->getNumVoxel()+ MString(" minvar ")+ data->getMinVariation()+ MString(" max level ")+ data->getMaxLevel()+ MString(" filter size ")+ def_area);

        char filename[512];
        sprintf( filename, "%s/%s.%d", cache_path.asChar(), cache_name.asChar(), frame );

        data->dumpIndirection(filename);

        delete data;
        particles.clear();
    }

    return MS::kSuccess;
}
Example #6
0
	void rasterizer::update(const render_state* state)
	{
		vp_ = &(state->vp_);
		target_vp_ = &(state->target_vp_);
		state_ = state->raster_state_.get();
        surface_ = state->color_targets_[0].get();
        caculate_vp();
        
        //frame_buffer_->update(state);
        
        wvp_.clear();
        indices_.clear();
        prim_vert_cnt_ = 0;
        // indices
        auto index_buffer = state->index_buffer_;
        buffer::transfer(index_buffer, indices_);
        
        // fetch model postion
        std::for_each(state->str_state_.buffer_descs_.begin(),
                      state->str_state_.buffer_descs_.end(),
                      [&](const stream_buffer_desc& desc)
                      {
                          auto input_desc = state->input_layout_->find_desc(desc.slot_);
                          if (input_desc == nullptr) {
                              return;
                          }
                          if (input_desc->semantic_name == "POSITION") {
                              buffer::transfer(desc.buf_,  wvp_, desc.slot_);
                          } else if (input_desc->semantic_name == "COLOR") {
							  buffer::transfer(desc.buf_, colors_);
                          }
                      });
        if (wvp_.empty()) {
            return;
        }
#if 1
        // transform to world space
		std::for_each(wvp_.begin(), wvp_.end(), [state](vec4& pos)
                      {
                          pos = state->mat_world_ * pos;
                      });

        // remove back face
        if (state->prim_topo_ == prim_tri_fan || state->prim_topo_ == prim_tri_list ||
            state->prim_topo_ == prim_tri_strip) {
            const auto& view_mat = state->mat_view_;
            auto cm = state_->get_desc().cm;
            vec3 view_dir(view_mat[2][0], view_mat[2][1], view_mat[2][2]); // todo: maybe have bug, need improve
            vec3 vt[3];
            auto itr = indices_.begin();
            for (; itr != indices_.end(); ) {
                for (int i = 0; i < 3; ++i) {
					const auto& vp = wvp_[*(itr + i)];
                    vt[i].x = vp.x;
					vt[i].y = vp.y;
					vt[i].z = vp.z;
                }
                vec3 v01 = vt[1] - vt[0];
                vec3 v02 = vt[2] - vt[0];
                vec3 tri_dir;
                if (cm == cull_ccw) {
                    tri_dir = v01.cross(v02);
                } else {
                    tri_dir = v02.cross(v01);
                }
                if (view_dir.dot(tri_dir) < 0) {
                    itr = indices_.erase(itr, itr + 3);
                } else {
                    itr += 3;
                }
            }
        }
#endif
        // only transform used verts to view&project&screen space
        auto unique_indice = indices_;
        std::sort(unique_indice.begin(), unique_indice.end());
        unique_indice.erase(std::unique(unique_indice.begin(), unique_indice.end()),
                            unique_indice.end());
		std::for_each(unique_indice.begin(), unique_indice.end(),
					  [this, state](uint16_t index)
                      {
                          vec4& tmp = wvp_[index];
						  tmp = state->mat_view_ * tmp;
						  tmp = state->mat_projection_ * tmp;
						  //tmp = (state->mat_projection_ * state->mat_view_) * tmp;
                          perspective_to_screen(tmp);
                      });
        //
        switch (state->prim_topo_) {
            case prim_point_list:
            case prim_point_sprite:
                prim_vert_cnt_ = 1;
            case prim_line_list:
            case prim_line_strip:
                prim_vert_cnt_ = 2;
                break;
            case prim_tri_fan:
            case prim_tri_list:
            case prim_tri_strip:
                prim_vert_cnt_ = 3;
                break;
            default:
                break;
        }
	}
Example #7
0
  int main()
  {
    setlocale(LC_ALL, "Russian");
	  char buffer[MAXBUF];

    //инициализация библиотеки Winsock
    if (WSAStartup(0x202,(WSADATA *)&buffer[0]))
    {
      printf("WSAStart error %d\n",WSAGetLastError());
	  _getch();
      return -1;
    }

    //создание сокета
    SOCKET sock;
    sock=socket(AF_INET,SOCK_STREAM,0);
    if (sock < 0)
    {
      printf("Socket() error %d\n",WSAGetLastError());
	  _getch();
      return -1;
    }

    //установка соединения
    // заполнение структуры sockaddr_in
    // указание адреса и порта сервера
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
    HOSTENT *hst;

    // преобразование IP адреса из символьного в
    // сетевой формат
    if (inet_addr(SERVERADDR)!=INADDR_NONE)
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
      // попытка получить IP адрес по доменному
      // имени сервера
      if (hst=gethostbyname(SERVERADDR))
      // hst->h_addr_list содержит не массив адресов,
      // а массив указателей на адреса
      ((unsigned long *)&dest_addr.sin_addr)[0]=
        ((unsigned long **)hst->h_addr_list)[0][0];
      else 
      {
        printf("Invalid address %s\n",SERVERADDR);
        closesocket(sock);
        WSACleanup();
		_getch();
        return -1;
      }

    if (connect(sock,(sockaddr *)&dest_addr,
                sizeof(dest_addr)))
    {
      printf("Connect error %d\n",WSAGetLastError());
	  _getch();
      return -1;
    }

	//-----------------------------------------------
	memset(buffer, 0, MAXBUF);
    recv(sock , buffer , MAXBUF , 0); // прием слова
    puts(buffer);
    printf("Для получения справки введите команду help\n");
    while(1){
		memset(buffer, 0, MAXBUF);
        printf("Cmd: ");
        scanf("%s" , buffer);
        // команды
        if(strcmp(buffer, "view") == 0)
			view_dir(buffer, sock, MAXBUF);
        else if(strcmp(buffer, "view_dir") == 0)
            view_dir(buffer, sock, MAXBUF);
        else if(strcmp(buffer, "help") == 0)
            get_help();
        else if(strcmp(buffer, "get_dir") == 0)
            get_dir(buffer, sock, MAXBUF);
        else if(strcmp(buffer, "ch_dir") == 0)
            ch_dir(buffer, sock, MAXBUF);
        else if(strcmp(buffer, "upload") == 0)
            upload(buffer, MAXBUF, sock);
		else if(strcmp(buffer, "download") == 0)
            download(buffer, MAXBUF, sock);
        else if(strcmp(buffer, "mk_dir") == 0)
            mk_dir(buffer, MAXBUF, sock);
        else if(strcmp(buffer, "rm_dir") == 0)
            rm_dir(buffer, MAXBUF, sock);
		else if(strcmp(buffer, "echo") == 0)
            echo(buffer, sock, MAXBUF);
		else if(strcmp(buffer, "disconnect") == 0){
            send(sock, "disconnect", 10, 0);
			break;
		}
        else
            printf("unknown comand\n");
        printf("Для получения справки введите команду help\n");
    }
	//-----------------------------------------------
	printf("\nExit\n");
    closesocket(sock);
    WSACleanup();
	_getch();
    return 0;
  }
Example #8
0
void Camera::zoom(float dist){
	glm::vec3 dir = view_dir();
	eye += dist * dir;
	center += dist * dir;
	view = glm::lookAt(eye, center, up);
}
Example #9
0
void Camera::roll(float deg){
	glm::mat4 rot = glm::rotate(util::deg_to_rad(deg), view_dir());
	up = glm::normalize(glm::vec3{rot * glm::vec4{up, 0}});
	view = glm::lookAt(eye, center, up);
}
Example #10
0
void Camera::strafe_horiz(float dist){
	glm::vec3 horiz = glm::cross(view_dir(), up);
	eye += dist * horiz;
	center += dist * horiz;
	view = glm::lookAt(eye, center, up);
}