void RankingScene::display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 画面とZバッファのクリア */ glClearColor(0, 0, 0, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 0, 0, 0, 1, 0, 1, 0); textureMap["font"]->drawString(" number of players " + total, Point2D( 0, 0.015 ), 0.75, Color( 1, 1, 1 ) ); textureMap["font"]->drawString("Rank Name Score", Point2D(0.05, 0.1), 1, Color(1, 0, 0)); Color gold(1, 0.8, 0); Color silver(0.8, 0.8, 0.8); Color bronze(0.8, 0.4, 0.1); Color blue(0.7, 0.7, 1); for (int i = 0; i < 10; i++) { if (i == 0) textureMap["font"]->drawString("1st", Point2D(0.05, 0.2 + 0.07*i), 0.8, gold); else if (i == 1) textureMap["font"]->drawString("2nd", Point2D(0.05, 0.2 + 0.07*i), 0.8, silver); else if (i == 2) textureMap["font"]->drawString("3rd", Point2D(0.05, 0.2 + 0.07*i), 0.8, bronze); else textureMap["font"]->drawString(to_string((long long)(i + 1)), Point2D(0.1, 0.2 + 0.07*i), 0.8, blue); } for (int j = 0; j < 10; j++){ if (j == 0){ textureMap["font"]->drawString(rank_name[j], Point2D(0.35, 0.2 + 0.07*j), 1, gold); textureMap["font"]->drawString(rank_score[j], Point2D(0.7, 0.2 + 0.07*j), 1, gold); } else if (j == 1){ textureMap["font"]->drawString(rank_name[j], Point2D(0.35, 0.2 + 0.07*j), 1, silver); textureMap["font"]->drawString(rank_score[j], Point2D(0.7, 0.2 + 0.07*j), 1, silver); } else if (j == 2){ textureMap["font"]->drawString(rank_name[j], Point2D(0.35, 0.2 + 0.07*j), 1, bronze); textureMap["font"]->drawString(rank_score[j], Point2D(0.7, 0.2 + 0.07*j), 1, bronze); } else{ textureMap["font"]->drawString(rank_name[j], Point2D(0.35, 0.2 + 0.07*j), 1, blue); textureMap["font"]->drawString(rank_score[j], Point2D(0.7, 0.2 + 0.07*j), 1, blue); } } if (counter % FPS < FPS/2) textureMap["spaceReturn"]->draw2D(Point2D(0.7, 0.9), 0.4, Color(1, 1, 1)); }
int main(int argc, char* argv[]) { // Build your scene and setup your camera here, by calling // functions from Raytracer. The code here sets up an example // scene and renders it from two different view points, DO NOT // change this if you're just implementing part one of the // assignment. Raytracer raytracer; int width = 320; int height = 240; int aa = 2; int sceneNum = 0; double toRadian = 2*M_PI/360.0; fprintf(stderr, "Using options:\n"); #ifdef USE_EXTENDEDLIGHTS fprintf(stderr, "\tExtended light sources\n"); #else fprintf(stderr, "\tPoint light sources\n"); #endif #ifdef USE_REFRACTIONS fprintf(stderr, "\tRefractions\n"); #else fprintf(stderr, "\tNo refractions\n"); #endif #ifdef USE_REFLECTIONS fprintf(stderr, "\tReflections\n"); #else fprintf(stderr, "\tNo reflections\n"); #endif #ifdef IGNORE_SHADOWS fprintf(stderr, "\tNo shadows\n"); #else { #ifdef USE_TRANSMISSIONSHADOWS fprintf(stderr, "\tTransmission-based shadows\n"); #else fprintf(stderr, "\tSimple shadows\n"); #endif } #endif #ifdef USE_FINERFLUX fprintf(stderr, "\tFiner numerical flux intergrations\n"); #else fprintf(stderr, "\tCoarser numerical flux intergrations\n"); #endif if (argc == 3) { width = atoi(argv[1]); height = atoi(argv[2]); } else if (argc == 4) { width = atoi(argv[1]); height = atoi(argv[2]); aa = atoi(argv[3]); } else if (argc == 5) { width = atoi(argv[1]); height = atoi(argv[2]); aa = atoi(argv[3]); sceneNum = atoi(argv[4]); } // SceneNum should not exceed total scenes if ((sceneNum > 3)|| (sceneNum <0)) { sceneNum = 0; } // Camera parameters. Point3D eye(0, 0, 1); Vector3D view(0, 0, -1); Vector3D up(0, 1, 0); double fov = 60; // Defines materials for shading. Material gold( Colour(0.3, 0.3, 0.3), Colour(0.75164, 0.60648, 0.22648), Colour(0.628281, 0.555802, 0.366065), 51.2, 0.001, 0.0, 1/2.4 ); Material jade( Colour(0.22, 0.38, 0.33), Colour(0.52, 0.73, 0.57), Colour(0.316228, 0.316228, 0.316228), 12.8, 0.2 , 0.0, 0.0 ); Material polishedGold( Colour(0.24725, 0.2245, 0.0645), Colour(0.34615, 0.3143, 0.0903), Colour(0.797357, 0.723991, 0.208006), 83.2, 0.01,0.0,0.0); Material glass( Colour(0.15, 0.15, 0.15), Colour(0.08, 0.08, 0.08), Colour(0.2, 0.2, 0.2), 50.1,0.08,0.9,0.6667 ); Material glass1( Colour(0.2, 0.2, 0.2), Colour(0.2, 0.2, 0.2), Colour(0.7, 0.7, 0.7), 10.1,0.03,0.9,0.6667 ); Material steel( Colour(0.1, 0.1, 0.1), Colour(0.1, 0.1, 0.1), Colour(0.8, 0.8, 0.8), 80, 0.03, 0.0, 1.0 ); Material blueSolid( Colour(0, 0, 1), Colour(0, 0, 1), Colour(0, 0, 0), 0, 0.0, 0.0, 1.0 ); Material redSolid( Colour(1, 0, 0), Colour(1, 0, 0), Colour(0, 0, 0), 0, 0.0, 0.0, 1.0 ); Material chrome( Colour(0.25, 0.25, 0.25), Colour(0.4,0.4,0.4), Colour(0.7746, 0.7746, 0.7746), 77, 0.42, 0.0, 1.0); Material ruby( Colour(0.1745, 0.01175, 0.01175), Colour(0.61424, 0.04136, 0.04136), Colour(0.727811, 0.626959, 0.626959) , 76.8, 0.01, 0.0, 0.565); Material pearl( Colour(0.25, 0.20725, 0.20725), Colour(1, 0.829, 0.829), Colour(0.296648, 0.296648, 0.296648), 11.264, 0.1,0.0,1.0 ); Material silver(Colour(0.23125, 0.23125, 0.23125), Colour(0.2775, 0.2775, 0.2775), Colour(0.773911, 0.773911, 0.773911), 89.6, 0.4,0.0, 1.0); Material emerald(Colour(0.0215, 0.1745, 0.0215),Colour(0.07568, 0.61424, 0.07568), Colour(0.633, 0.727811, 0.633), 76.8, 0.1, 0.25, 0.637); Material brass(Colour(0.329412, 0.223529, 0.027451),Colour(0.780392, 0.568627, 0.113725), Colour(0.992157, 0.941176, 0.807843),27.8974, 0.3, 0.0, 1.0 ); Material bronze(Colour(0.2125, 0.1275, 0.054), Colour(0.714, 0.4284, 0.18144), Colour(0.393548, 0.271906, 0.166721), 25.6, 0.1, 0.0, 1.0 ); Material bronzeShiny(Colour(0.25, 0.148, 0.06475), Colour(0.4, 0.2368, 0.1036), Colour(0.774597, 0.458561, 0.200621), 76.86, 0.15, 0.0, 1.0 ); Material turquoise(Colour(0.1, 0.18725, 0.1745), Colour(0.396, 0.74151, 0.69102), Colour(0.297254, 0.30829, 0.306678), 12.8, 0.01, 0.2, 0.9); Material obsidian(Colour(0.05375, 0.05, 0.06625), Colour(0.18275, 0.17, 0.22525), Colour(0.332741, 0.328634, 0.346435), 38.4, 0.05, 0.18, 0.413); Material copper(Colour(0.19125, 0.0735, 0.0225), Colour(0.7038, 0.27048, 0.0828), Colour(0.256777, 0.137622, 0.086014), 12.8, 0.1, 0.0, 1.0 ); Material copperPolished(Colour(0.2295, 0.08825, 0.0275), Colour(0.5508, 0.2118, 0.066), Colour(0.580594, 0.223257, 0.0695701), 51.2, 0.15, 0.0, 1.0 ); Material pewter(Colour(0.105882, 0.058824, 0.113725), Colour(0.427451, 0.470588, 0.541176), Colour(0.333333, 0.333333, 0.521569), 9.84615, 0.0, 0.0, 1.0 ); // Light Sources //===================== //raytracer.addLightSource( new PointLight(Point3D(1, 1, 2),Colour(0.5, 0.5, 0.5)) ); #ifdef USE_EXTENDEDLIGHTS // Defines a ball light source raytracer.addLightSource( new BallLight(Point3D(-1, 1, 1), 2.0, Colour(0.9, 0.9, 0.9), 4) ); #else // Defines a point light source. raytracer.addLightSource( new PointLight(Point3D(0, 0, 5), Colour(0.9, 0.9,0.9) ) ); #endif if (sceneNum==0) { // Defines a point light source. //raytracer.addLightSource( new PointLight(Point3D(0, 0, 5), // Colour(0.9, 0.9, 0.9) ) ); // Add a unit square into the scene with material mat. SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &gold); SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &jade ); // Apply some transformations to the unit square. double factor1[3] = { 1.0, 2.0, 1.0 }; double factor2[3] = { 6.0, 6.0, 1.0 }; double factor3[3] = { 4.0, 4.0, 4.0 }; double factor4[3] = { 3.7, 3.7, 3.7 }; raytracer.translate(sphere, Vector3D(0, 0, -5)); raytracer.rotate(sphere, 'x', -45); raytracer.rotate(sphere, 'z', 45); raytracer.scale(sphere, Point3D(0, 0, 0), factor1); raytracer.translate(plane, Vector3D(0, 0, -7)); raytracer.rotate(plane, 'z', 45); raytracer.scale(plane, Point3D(0, 0, 0), factor2); /* SceneDagNode* bigSphere = raytracer.addObject( new UnitSphere(), &glass1); raytracer.scale(bigSphere, Point3D(0, 0, 0), factor3); raytracer.translate(bigSphere, Vector3D(0, 0, -7)); SceneDagNode* bigSphere2 = raytracer.addObject( new UnitSphere(), &glass1); raytracer.scale(bigSphere2, Point3D(0, 0, 0), factor4); raytracer.translate(bigSphere2, Vector3D(0, 0, -7)); */ }// end of scene 0 if (sceneNum==1) { /* raytracer.addLightSource( new BallLight(Point3D(-1, 1, 1), 5.0, Colour(0.9, 0.9, 0.9), 0.888) ); raytracer.addLightSource( new PointLight(Point3D(0, 0, 2),Colour(0.5, 0.5, 0.5)) ); */ // Add a unit square into the scene with material mat. SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &glass); SceneDagNode* sphere1 = raytracer.addObject( new UnitSphere(), &brass); SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &jade); SceneDagNode* cylinder = raytracer.addObject( new UnitCylinder(), &brass); // Apply some transformations to the unit square. double factor1[3] = { 1.0, 2.0, 1.0 }; double factor2[3] = { 6.0, 6.0, 1.0 }; double factor3[3] = { 0.5, 0.5, 2.0 }; raytracer.translate(sphere, Vector3D(0, 0, -5)); raytracer.rotate(sphere, 'x', -45); raytracer.rotate(sphere, 'z', 45); raytracer.scale(sphere, Point3D(0, 0, 0), factor1); raytracer.translate(sphere1, Vector3D(-2.5, 0, -5)); raytracer.translate(plane, Vector3D(0, 0, -7)); raytracer.rotate(plane, 'z', 45); raytracer.scale(plane, Point3D(0, 0, 0), factor2); raytracer.translate(cylinder, Vector3D(3, 0, -5)); //raytracer.rotate(cylinder, 'y', -20); raytracer.rotate(cylinder, 'z', 45); raytracer.rotate(cylinder, 'x', -75); raytracer.scale(cylinder, Point3D(0, 0, 0), factor3); }// end of scene1 //=============== Scene 2 ============================== //===================================================== if(sceneNum == 2) { /* raytracer.addLightSource( new BallLight(Point3D(-1, 1, 1), 5.0, Colour(0.9, 0.9, 0.9), 0.888) );*/ //raytracer.addLightSource( new PointLight(Point3D(0, 0, 2),Colour(0.5, 0.5, 0.5)) ); //Set up walls //======================================================== SceneDagNode* planeBack = raytracer.addObject( new UnitSquare(), &brass); SceneDagNode* planeBottom = raytracer.addObject( new UnitSquare(), &chrome); SceneDagNode* planeTop = raytracer.addObject( new UnitSquare(), &copperPolished); SceneDagNode* planeLeft = raytracer.addObject( new UnitSquare(), &bronzeShiny); SceneDagNode* planeRight = raytracer.addObject( new UnitSquare(), &brass); SceneDagNode* planeRear = raytracer.addObject( new UnitSquare(), &brass); double scaleFactor[3] = {8.0,8.0,1.0}; double scaleFactor1[3] = {20.01,20.01,1.0}; raytracer.translate(planeBottom, Vector3D(0, -10, 0)); raytracer.translate(planeTop, Vector3D(0, 10, 0)); raytracer.translate(planeLeft, Vector3D(-10, 0, 0)); raytracer.translate(planeRight, Vector3D(10, 0, 0)); raytracer.translate(planeBack, Vector3D(0, 0, -19.9)); raytracer.translate(planeBottom, Vector3D(0, 0, -10)); raytracer.translate(planeTop, Vector3D(0, 0, -10)); raytracer.translate(planeLeft, Vector3D(0, 0, -10)); raytracer.translate(planeRight, Vector3D(0, 0, -10)); raytracer.translate(planeRear, Vector3D(0, 0, 20)); raytracer.rotate(planeTop, 'x', 90); raytracer.rotate(planeBottom, 'x',-90); raytracer.rotate(planeLeft, 'y', -90); raytracer.rotate(planeRight, 'y', 90); raytracer.rotate(planeRear, 'x', 180); raytracer.scale(planeBack, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeBottom, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeTop, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeLeft, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeRight, Point3D(0, 0, 0), scaleFactor1); raytracer.scale(planeRear, Point3D(0, 0, 0), scaleFactor1); //=========================================================== double scaleEgg[3] = { 1.0, 1.5, 1.0 }; double scaleBall[3] = {2,2,2}; SceneDagNode* sphere = raytracer.addObject( new UnitSphere(), &glass1); SceneDagNode* sphere1 = raytracer.addObject( new UnitSphere(), &ruby); SceneDagNode* sphere2 = raytracer.addObject( new UnitSphere(), &chrome); //SceneDagNode* cone = raytracer.addObject(sphere, new UnitCone(), &emerald); //raytracer.translate(cone, Vector3D(0,0,-2)); raytracer.translate(sphere, Vector3D(-1,-1,-11)); raytracer.scale(sphere, Point3D(0,0,0), scaleBall); raytracer.translate(sphere1, Vector3D(2.5,-1,-11)); raytracer.translate(sphere2, Vector3D(2,3,-11)); //raytracer.translate(cone, Vector3D(-1,-1,-12)); raytracer.rotate(sphere1, 'z', -45); raytracer.scale(sphere1, Point3D(0,0,0), scaleEgg); //raytracer.rotate(cone, 'x', 90); }//end of scene 2 //==================== Scene 3 ================= //=============================================== if(sceneNum == 3) { #ifdef USE_EXTENDEDLIGHTS raytracer.addLightSource( new BallLight(Point3D(-5, 5, -3), 2.0, Colour(0.4, 0.4, 0.4), 2) ); raytracer.addLightSource( new BallLight(Point3D(5, 5, -3), 2.0, Colour(0.4, 0.4, 0.4), 2) ); #else raytracer.addLightSource( new PointLight(Point3D(-5, 5, 0), Colour(0.5, 0.0, 0.0) ) ); raytracer.addLightSource( new PointLight(Point3D(5, 5, 0), Colour(0.0, 0.5, 0.0) ) ); raytracer.addLightSource( new PointLight(Point3D(0, -5, 0), Colour(0.0, 0.0, 0.5) ) ); #endif double planeScale[3] = {10.0, 10.0, 1.0}; double sphereScale[3]= {1.5,1.5,1.5}; double coneScale[3] = {1.5,1.5,5}; SceneDagNode* plane = raytracer.addObject( new UnitSquare(), &pearl); SceneDagNode* sphere1 = raytracer.addObject( new UnitSphere(), &chrome); SceneDagNode* sphere2 = raytracer.addObject( new UnitSphere(), &brass); //SceneDagNode* cone = raytracer.addObject( new UnitCone(), &turquoise); raytracer.translate(sphere1, Vector3D(1, 1.5, -6.5)); raytracer.translate(sphere2, Vector3D(-1, -1.5, -6.5)); raytracer.scale(sphere2, Point3D(0,0,0), sphereScale); raytracer.scale(sphere1, Point3D(0,0,0), sphereScale); raytracer.rotate(plane, 'z', 45); raytracer.scale(plane, Point3D(0,0,0), planeScale); raytracer.translate(plane, Vector3D(0, 0, -8)); /* raytracer.translate(cone, Vector3D(2.0,-1.0,-3)); raytracer.rotate(cone, 'x', 180); raytracer.scale(cone, Point3D(0,0,0), coneScale); */ } // Render the scene, feel free to make the image smaller for // testing purposes. raytracer.render(width, height, eye, view, up, fov, aa, "sig1.bmp", 's'); //raytracer.render(width, height, eye, view, up, fov, aa, "diffuse1.bmp",'d'); //raytracer.render(width, height, eye, view, up, fov, aa, "view1.bmp",'p'); // Render it from a different point of view. Point3D eye2(4, 2, 1); Vector3D view2(-4, -2, -6); raytracer.render(width, height, eye2, view2, up, fov, aa, "sig2.bmp", 's'); //raytracer.render(width, height, eye2, view2, up, fov, aa, "diffuse2.bmp",'d'); //raytracer.render(width, height, eye2, view2, up, fov, aa, "view2.bmp",'p'); Point3D eye3(-4, -2, 1); Vector3D view3(4, 2, -6); raytracer.render(width, height, eye3, view3, up, fov, aa, "sig3.bmp", 's'); //raytracer.render(width, height, eye3, view3, up, fov, aa, "diffuse3.bmp",'d'); raytracer.render(width, height, eye3, view3, up, fov, aa, "view3.bmp",'p'); return 0; }
int read_msg(char *src, char *Instr, char *Arg1, char *Arg2) { //printf("Received: FROM => %s\tCMD => %s,%s,%s\n",src,Instr,Arg1,Arg2); char instr[CONTENT_MAX]; char arg1[CONTENT_MAX]; char arg2[CONTENT_MAX]; strcpy(instr,Instr); strcpy(arg1,Arg1); strcpy(arg2,Arg2); if(echo(instr)) { message_host(src,"echo,NULL,NULL"); } /* Database will immediately notify its registered clients if local data * has been updated, only when the database is configured to PUSH updates * with the command line flag -p */ else if(incr(instr)) { if(PUSH_UPDATES) { // send invalidation msg to all known clients struct cache_entry *client; int index=0; /* Iterates over all saved clients */ for(index=0;index<clients_cache->length;index++) { client = get_index(index,clients_cache); printf("Pushing updates to client [%s]\n",client->value); char msg[CONTENT_MAX]; sprintf(msg,"%s,%s,%s",inv,arg1,arg2); message_host(client->value,msg); } } /* Routine for updating local data */ if(rome(arg1)) { if(gold(arg2)) { r.gold++; } if(silver(arg2)) { r.silver++; } if(bronze(arg2)) { r.bronze++; } if(tennis(arg2)) { score_tennis.rome_score++; } if(soccer(arg2)) { score_soccer.rome_score++; } if(frisbee(arg2)) { score_frisbee.rome_score++; } } if(gaul(arg1)) { if(gold(arg2)) { g.gold++; } if(silver(arg2)) { g.silver++; } if(bronze(arg2)) { g.bronze++; } if(tennis(arg2)) { score_tennis.gaul_score++; } if(soccer(arg2)) { score_soccer.gaul_score++; } if(frisbee(arg2)) { score_frisbee.gaul_score++; } } /* Display updates on the terminal screen */ printf("Update received -------------------------\n" "Gaul >> Gold %d, Silver %d, Bronze %d\n" "Rome >> Gold %d, Silver %d, Bronze %d\n" "--------------------------------------------\n" "Tennis: Gaul %d | Rome %d\n" "Frisbee: Gaul %d | Rome %d\n" "Soccer: Gaul %d | Rome %d\n", r.gold, r.silver, r.bronze, g.gold, g.silver, g.bronze, score_tennis.gaul_score, score_tennis.rome_score, score_frisbee.gaul_score, score_frisbee.rome_score, score_soccer.gaul_score, score_soccer.rome_score); } /* Service client query */ else if(query(instr)) { // when a front-end server queries for the first time, add it to the // cache of known hosts printf("Responding to query [%s:%s] from client [%s]\n", arg1,arg2,src); while(clients_cache==NULL); // wait for client cache to come online struct cache_entry *connected_client; unsigned int client_id; inet_pton(AF_INET,src,&client_id); connected_client = new_cache_entry(client_id,src); if(!found(client_id,clients_cache)) add_cache_entry(SORTED,connected_client,clients_cache); /* Build query response */ char response[100]; if(rome(arg1)) { if(gold(arg2)) { sprintf(response,"rome,gold,%d",r.gold); } if(silver(arg2)) { sprintf(response,"rome,silver,%d",r.silver); } if(bronze(arg2)) { sprintf(response,"rome,bronze,%d",r.bronze); } if(tennis(arg2)) { sprintf(response,"rome,tennis,%d",score_tennis.rome_score); } if(soccer(arg2)) { sprintf(response,"rome,soccer,%d",score_soccer.rome_score); } if(frisbee(arg2)) { sprintf(response,"rome,frisbee,%d",score_frisbee.rome_score); } } if(gaul(arg1)) { if(gold(arg2)) { sprintf(response,"gaul,gold,%d",r.gold); } if(silver(arg2)) { sprintf(response,"gaul,silver,%d",r.silver); } if(bronze(arg2)) { sprintf(response,"gaul,bronze,%d",r.bronze); } if(tennis(arg2)) { sprintf(response,"gaul,tennis,%d",score_tennis.gaul_score); } if(soccer(arg2)) { sprintf(response,"gaul,soccer,%d",score_soccer.gaul_score); } if(frisbee(arg2)) { sprintf(response,"gaul,frisbee,%d",score_soccer.gaul_score); } } printf("Responding to %s\n",src); message_host(src,response); } return 0; }
int main(int argc, char** argv) { // initialize guacamole gua::init(argc, argv); // setup scene gua::SceneGraph graph("main_scenegraph"); gua::math::vec4 iron(0.560, 0.570, 0.580, 1); gua::math::vec4 silver(0.972, 0.960, 0.915, 1); gua::math::vec4 aluminium(0.913, 0.921, 0.925, 1); gua::math::vec4 gold(1.000, 0.766, 0.336, 1); gua::math::vec4 copper(0.955, 0.637, 0.538, 1); gua::math::vec4 chromium(0.550, 0.556, 0.554, 1); gua::math::vec4 nickel(0.660, 0.609, 0.526, 1); gua::math::vec4 titanium(0.542, 0.497, 0.449, 1); gua::math::vec4 cobalt(0.662, 0.655, 0.634, 1); gua::math::vec4 platinum(0.672, 0.637, 0.585, 1); auto pbrMat(gua::MaterialShaderDatabase::instance()->lookup("gua_default_material")->make_new_material()); // pbrMat.set_uniform("Color", chromium); // pbrMat.set_uniform("Roughness", 0.2f); // pbrMat.set_uniform("Metalness", 1.0f); std::string directory("/opt/3d_models/Cerberus_by_Andrew_Maximov/Textures/"); pbrMat->set_uniform("ColorMap", directory + "Cerberus_A.tga"); pbrMat->set_uniform("MetalnessMap", directory + "Cerberus_M.tga"); pbrMat->set_uniform("RoughnessMap", directory + "Cerberus_R.tga"); pbrMat->set_uniform("NormalMap", directory + "Cerberus_N.negated_green.tga"); gua::TriMeshLoader loader; auto transform = graph.add_node<gua::node::TransformNode>("/", "transform"); auto cerberus(loader.create_geometry_from_file( "cerberus", "/opt/3d_models/Cerberus_by_Andrew_Maximov/Cerberus_LP.3ds", pbrMat, gua::TriMeshLoader::NORMALIZE_POSITION | gua::TriMeshLoader::NORMALIZE_SCALE)); graph.add_node("/transform", cerberus); cerberus->set_draw_bounding_box(true); cerberus->rotate(90, 0.f, 1.f, 0.f); cerberus->rotate(90, 0.f, 0.f, 1.f); auto pointLight = graph.add_node<gua::node::LightNode>("/", "pointLight"); pointLight->data.set_type(gua::node::LightNode::Type::POINT); pointLight->data.color = gua::utils::Color3f(1.0f, 1.0f, 1.0f); pointLight->data.brightness = 150.0f; // lm pointLight->scale(9.f); pointLight->translate(-2.f, 3.f, 5.f); auto screen = graph.add_node<gua::node::ScreenNode>("/", "screen"); screen->data.set_size(gua::math::vec2(1.92f, 1.08f)); screen->translate(0, 0, 1.0); // add mouse interaction gua::utils::Trackball trackball(0.01, 0.002, 0.2); // setup rendering pipeline and window // auto resolution = gua::math::vec2ui(1920, 1080); auto resolution = gua::math::vec2ui(2560, 1440); std::string skymaps_dir("/opt/guacamole/resources/skymaps/"); for(auto const& file : {std::string(directory + "Cerberus_A.tga"), std::string(directory + "Cerberus_M.tga"), std::string(directory + "Cerberus_R.tga"), std::string(directory + "Cerberus_N.negated_green.tga"), std::string(skymaps_dir + "skymap.jpg")}) { gua::TextureDatabase::instance()->load(file); } auto tiledPipe(std::make_shared<gua::PipelineDescription>()); tiledPipe->add_pass(std::make_shared<gua::TriMeshPassDescription>()); tiledPipe->add_pass(std::make_shared<gua::LightVisibilityPassDescription>()); tiledPipe->add_pass(std::make_shared<gua::ResolvePassDescription>()); auto camera = graph.add_node<gua::node::CameraNode>("/screen", "cam"); camera->translate(0, 0, 2.0); camera->config.set_resolution(resolution); camera->config.set_screen_path("/screen"); camera->config.set_scene_graph_name("main_scenegraph"); camera->config.set_output_window_name("main_window"); camera->config.set_enable_stereo(false); camera->set_pipeline_description(tiledPipe); auto window = std::make_shared<gua::GlfwWindow>(); gua::WindowDatabase::instance()->add("main_window", window); window->config.set_enable_vsync(false); window->config.set_size(resolution); window->config.set_resolution(resolution); window->config.set_stereo_mode(gua::StereoMode::MONO); window->on_resize.connect([&](gua::math::vec2ui const& new_size) { window->config.set_resolution(new_size); camera->config.set_resolution(new_size); screen->data.set_size(gua::math::vec2(0.001 * new_size.x, 0.001 * new_size.y)); }); window->on_move_cursor.connect([&](gua::math::vec2 const& pos) { trackball.motion(pos.x, pos.y); }); window->on_button_press.connect(std::bind(mouse_button, std::ref(trackball), std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); window->open(); gua::Renderer renderer; // application loop gua::events::MainLoop loop; gua::events::Ticker ticker(loop, 1.0 / 500.0); size_t ctr{}; ticker.on_tick.connect([&]() { // apply trackball matrix to object gua::math::mat4 modelmatrix = scm::math::make_translation(gua::math::float_t(trackball.shiftx()), gua::math::float_t(trackball.shifty()), gua::math::float_t(trackball.distance())) * gua::math::mat4(trackball.rotation()); transform->set_transform(modelmatrix); if(ctr++ % 150 == 0) gua::Logger::LOG_WARNING << "Frame time: " << 1000.f / window->get_rendering_fps() << " ms, fps: " << window->get_rendering_fps() << std::endl; window->process_events(); if(window->should_close()) { renderer.stop(); window->close(); loop.stop(); } else { renderer.queue_draw({&graph}); } }); loop.start(); return 0; }
//打开物品 int CharData::openSlotItm(int slot, int nums, json_spirit::Object& robj) { boost::shared_ptr<iItem> itm = m_bag.getItem(slot); if (!itm.get()) { return HC_ERROR; } if (itm->getType() != iItem_type_gem) { return HC_ERROR; } int use_num = itm->getCount(); if (nums > 0 && itm->getCount() > nums) { use_num = nums; } Gem* pg = dynamic_cast<Gem*>(itm.get()); robj.push_back( Pair("use", pg->getUsage()) ); switch (pg->getUsage()) { //变身卡 case ITEM_USAGE_CHANGE_CARD: { m_change_spic = itm->getSubtype() - 499; m_change_spic_time = time(NULL) + 7200; m_bag.removeItem(slot); itm->Clear(); itm->Save(); //robj.push_back( Pair("refresh", 1) ); setExtraData(char_data_type_normal, char_data_change_spic, m_change_spic); setExtraData(char_data_type_normal, char_data_change_spic_time, m_change_spic_time); return HC_SUCCESS; } //兑换货币 case ITEM_USAGE_SILVER_CARD: { int total = pg->getValue() * use_num; addSilver(total); //银币统计 add_statistics_of_silver_get(m_id,m_ip_address,total,silver_get_by_treasure, m_union_id, m_server_id); json_spirit::Object obj; obj.push_back( Pair("type", item_type_silver) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", 0) ); obj.push_back( Pair("fac", 0) ); obj.push_back( Pair("name", strSilver) ); robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); NotifyCharData(); return HC_SUCCESS; } case ITEM_USAGE_GOLD_CARD: { int total = pg->getValue() * use_num; addGold(total); //金币获得统计 add_statistics_of_gold_get(m_id,m_ip_address,total,gold_get_treasure, m_union_id, m_server_id); json_spirit::Object obj; obj.push_back( Pair("type", item_type_gold) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", 0) ); obj.push_back( Pair("fac", 0) ); obj.push_back( Pair("name", strGold) ); robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); NotifyCharData(); return HC_SUCCESS; } case ITEM_USAGE_YUSHI_CARD: { int total = pg->getValue() * use_num; addTreasure(treasure_type_yushi, total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_treasure) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", treasure_type_yushi) ); obj.push_back( Pair("fac", 0) ); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(treasure_type_yushi); if (tr.get()) { obj.push_back( Pair("quality", tr->quality) ); obj.push_back( Pair("spic", tr->spic) ); obj.push_back( Pair("name", tr->name) ); } robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); return HC_SUCCESS; } case ITEM_USAGE_PRESTIGE_CARD: { int total = pg->getValue() * use_num; addPrestige(total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_prestige) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", 0) ); obj.push_back( Pair("fac", 0) ); obj.push_back( Pair("name", strPrestige) ); robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); return HC_SUCCESS; } case ITEM_USAGE_SUPPLY_CARD: { int total = pg->getValue() * use_num; addTreasure(treasure_type_supply, total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_treasure) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", treasure_type_supply) ); obj.push_back( Pair("fac", 0) ); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(treasure_type_supply); if (tr.get()) { obj.push_back( Pair("quality", tr->quality) ); obj.push_back( Pair("spic", tr->spic) ); obj.push_back( Pair("name", tr->name) ); } robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); NotifyCharData(); return HC_SUCCESS; } case ITEM_USAGE_GONGXUN_CARD: { int total = pg->getValue() * use_num; addTreasure(treasure_type_gongxun, total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_treasure) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", treasure_type_gongxun) ); obj.push_back( Pair("fac", 0) ); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(treasure_type_gongxun); if (tr.get()) { obj.push_back( Pair("quality", tr->quality) ); obj.push_back( Pair("spic", tr->spic) ); obj.push_back( Pair("name", tr->name) ); } robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); return HC_SUCCESS; } //卷轴 case ITEM_USAGE_EQUIPMENT_SCROLL: { equipment_scroll* sp = Singleton<equipment_scroll_mgr>::Instance().getScroll(pg->getValue()); if (!sp) { return HC_ERROR; } json_spirit::Object eq = sp->m_eqobj; bool canMake = true; json_spirit::Array mlist; json_spirit::Object o; o.push_back( Pair("name", sp->m_equipment_src->name) ); o.push_back( Pair("type", iItem_type_equipment) ); o.push_back( Pair("id", sp->m_equipment_src->baseid) ); o.push_back( Pair("spic", sp->m_equipment_src->baseid) ); o.push_back( Pair("quality", sp->m_equipment_src->quality) ); o.push_back( Pair("need", 1) ); if (sp->m_equipment_src->m_place.get()) { bool can_sweep = false; o.push_back( Pair("info", sp->m_equipment_src->m_place->info) ); if (sp->m_equipment_src->m_place->type == 1) { can_sweep = m_tempo.check_stronghold_can_sweep(sp->m_equipment_src->m_place->mapId,sp->m_equipment_src->m_place->stageId,sp->m_equipment_src->m_place->pos); boost::shared_ptr<StrongholdData> bstronghold = GeneralDataMgr::getInstance()->GetStrongholdData(sp->m_equipment_src->m_place->mapId,sp->m_equipment_src->m_place->stageId,sp->m_equipment_src->m_place->pos); if (bstronghold.get()) { o.push_back( Pair("open_level", bstronghold->m_level) ); } o.push_back( Pair("can_sweep", can_sweep) ); } else if (sp->m_equipment_src->m_place->type == 2) { can_sweep = eliteCombatMgr::getInstance()->check_stronghold_can_attack(m_id,sp->m_equipment_src->m_place->mapId,sp->m_equipment_src->m_place->pos); o.push_back( Pair("can_sweep", can_sweep) ); } } EquipmentData* src_eq = m_bag.getDefaultEquip(sp->m_src_equipment, 999); if (src_eq) { robj.push_back( Pair("eid", src_eq->id) ); o.push_back( Pair("num", 1) ); int nextqLevel = src_eq->qLevel; int nextAdd = src_eq->addValue; int nextAdd2 = src_eq->addValue2; upgradeValue(sp->m_equipment->up_quality, src_eq->type, nextqLevel, nextAdd, nextAdd2); eq.push_back( Pair("level", nextqLevel) ); eq.push_back( Pair("addNums", sp->m_equipment->baseValue + nextAdd) ); if (nextAdd2 > 0) { eq.push_back( Pair("addNums2", sp->m_equipment->baseValue2 + nextAdd2) ); } } else { eq.push_back( Pair("level", 0) ); eq.push_back( Pair("addNums", sp->m_equipment->baseValue) ); if (sp->m_equipment->baseValue2 > 0) { eq.push_back( Pair("addNums2", sp->m_equipment->baseValue2) ); } o.push_back( Pair("num", 0) ); canMake = false; } mlist.push_back(o); robj.push_back( Pair("eq", eq) ); //检查材料是否足够 canMake &= checkMaterial(sp, *this, m_bag, mlist); robj.push_back( Pair("mlist", mlist) ); robj.push_back( Pair("canMake", canMake) ); return HC_SUCCESS; } //VIP经验卡 case ITEM_USAGE_VIP_EXP_80: case ITEM_USAGE_VIP_EXP: { if (m_vip < 0 || m_vip >= 12) { return HC_ERROR; } if (pg->getValue() <= 0) { return HC_ERROR; } int add = 0; int count = use_num; if (count >= itm->getCount()) { count = itm->getCount(); } else if (count <= 0) { count = 1; } int old_recharge = m_total_recharge + m_vip_exp; //上限限制 if (pg->getUsage() == ITEM_USAGE_VIP_EXP_80) { //只能升级到80% int max_vip = iVIP_recharge[m_vip] * 4 / 5; if (old_recharge >= max_vip) { return HC_ERROR_USE_VIP_CARD; } int canAdd = max_vip - old_recharge; int maxUsed = canAdd / pg->getValue(); if (canAdd % pg->getValue() != 0) { ++maxUsed; } if (count > maxUsed) { count = maxUsed; } add = pg->getValue() * count; if (add > canAdd) { add = canAdd; } } else if (pg->getUsage() == ITEM_USAGE_VIP_EXP) { add = pg->getValue() * count; } if (itm->getCount() == count) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); } else { itm->addCount(-count); itm->Save(); } m_vip_exp += add; InsertSaveDb("update char_data set exp=" + LEX_CAST_STR(m_vip_exp) + " where cid=" + LEX_CAST_STR(m_id)); if (pg->getUsage() == ITEM_USAGE_VIP_EXP) { updateVip(); } //通知客户端,充值条变化 robj.push_back( Pair("rechargeFrom", old_recharge) ); robj.push_back( Pair("rechargeAdd", add) ); return HC_SUCCESS; } //限时增益 case ITEM_USAGE_BUFF_BINGLI: case ITEM_USAGE_BUFF_WUGONG: case ITEM_USAGE_BUFF_WUFANG: case ITEM_USAGE_BUFF_CEGONG: case ITEM_USAGE_BUFF_CEFANG: { if (pg->getValue() <= 0) { return HC_ERROR; } if (itm->getInvalidTime() <= time(NULL)) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); return HC_ERROR; } int count = 1; if (itm->getCount() == count) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); } else { itm->addCount(-count); itm->Save(); } m_Buffs.addBuff(pg->getUsage()-ITEM_USAGE_BUFF_BINGLI+1,pg->getValue(),7200); #ifdef QQ_PLAT treasure_cost_tencent(this,(int)itm->getSubtype(),1); #endif return HC_SUCCESS; } //开启宝箱 case ITEM_USAGE_BOX: { if (pg->getValue() <= 0) { return HC_ERROR; } int count = use_num; if (count >= itm->getCount()) { count = itm->getCount(); } else if (count <= 0) { count = 1; } //开启宝箱需要银币 int need_silver = count * pg->getValue(); if (silver() < need_silver) { if (count > 1) { count = silver() / pg->getValue(); need_silver = count * pg->getValue(); robj.push_back( Pair("msg", getErrMsg(HC_ERROR_NOT_ENOUGH_SILVER)) ); } else { std::string msg = strBoxSilverNotEnoughMsg; str_replace(msg, "$S", LEX_CAST_STR(pg->getValue())); robj.push_back( Pair("msg", msg) ); return HC_ERROR; } } //开启宝箱需要位置 if (count > 0 && (m_bag.size()-m_bag.getUsed()) < count) return HC_ERROR_NOT_ENOUGH_BAG_SIZE; if (itm->getCount() == count) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); } else { itm->addCount(-count); itm->Save(); } if (count == 1) { addSilver(-need_silver); add_statistics_of_silver_cost(m_id,m_ip_address,need_silver,silver_cost_for_open_box, m_union_id, m_server_id); //给奖励! std::list<Item> getItems; int notify = lootMgr::getInstance()->getBoxLoots(itm->getSubtype(), getItems, 0); if (notify > 0) { std::string msg = strBoxGetMsg; str_replace(msg, "$W", MakeCharNameLink(m_name)); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(itm->getSubtype()); if (tr.get()) { std::string name = tr->name; addColor(name, tr->quality); str_replace(msg, "$B", name); } Item& item = *(getItems.begin()); if (item.type == item_type_treasure) { tr = GeneralDataMgr::getInstance()->GetBaseTreasure(item.id); if (tr.get()) { std::string name = MakeTreasureLink(tr->name, item.id); addColor(name, tr->quality); str_replace(msg, "$R", name); } } json_spirit::mObject mobj; mobj["cmd"] = "broadCastMsg"; mobj["msg"] = msg; boost::shared_ptr<splsTimer> tmsg; tmsg.reset(new splsTimer(4, 1, mobj,1)); splsTimerMgr::getInstance()->addTimer(tmsg); } //随机列表 std::list<Item> items_list; lootMgr::getInstance()->getBoxLootsInfo(itm->getSubtype(),items_list); json_spirit::Array alist; for (std::list<Item>::iterator it = items_list.begin(); it != items_list.end(); ++it) { Item& item = *it; json_spirit::Object obj; if ((*(getItems.begin())).id == item.id && (*(getItems.begin())).type == item.type && (*(getItems.begin())).nums == item.nums && (*(getItems.begin())).fac == item.fac) { obj.push_back( Pair("get", 1) ); } item.toObj(obj); alist.push_back(obj); } robj.push_back( Pair("list", alist) ); giveLoots(this, getItems, m_area, m_level, 0, NULL, &robj, true, give_box_loot); } else { addSilver(-need_silver); add_statistics_of_silver_cost(m_id,m_ip_address,need_silver,silver_cost_for_open_box, m_union_id, m_server_id); //给奖励! std::list<Item> getAllItems; for (int i = 0; i < count; ++i) { std::list<Item> getItems; int notify = lootMgr::getInstance()->getBoxLoots(itm->getSubtype(), getItems, 0); Item& item = *(getItems.begin()); if (notify > 0) { std::string msg = strBoxGetMsg; str_replace(msg, "$W", MakeCharNameLink(m_name)); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(itm->getSubtype()); if (tr.get()) { std::string name = tr->name; addColor(name, tr->quality); str_replace(msg, "$B", name); } if (item.type == item_type_treasure) { tr = GeneralDataMgr::getInstance()->GetBaseTreasure(item.id); if (tr.get()) { std::string name = MakeTreasureLink(tr->name, item.id); addColor(name, tr->quality); str_replace(msg, "$R", name); } } GeneralDataMgr::getInstance()->broadCastSysMsg(msg, -1); } getAllItems.push_back(item); } giveLoots(this, getAllItems, m_area, m_level, 0, NULL, &robj, true, give_box_loot); } #ifdef QQ_PLAT //treasure_cost_tencent(this,(int)itm->getSubtype(),1); #endif NotifyCharData(); return HC_SUCCESS; } } return HC_ERROR;//未知类型 }