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); }
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); }
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); }
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; }
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; }
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; } }
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; }
void Camera::zoom(float dist){ glm::vec3 dir = view_dir(); eye += dist * dir; center += dist * dir; view = glm::lookAt(eye, center, up); }
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); }
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); }