void Camera::Setup(int viewportWidth, int viewportHeight) { if (renderToTexture) { BindFrameBufferObject(); glViewport(0, 0, fboWidth, fboHeight); // currently this should only be true on depth rendering //Disable color rendering, we only want to write to the Z-Buffer glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); } else { glViewport(0, 0, viewportWidth, viewportHeight); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (renderToTexture && framebufferTextureType == GL_TEXTURE_CUBE_MAP) { glFrustum(left, right, bottom, top, nearPlane, farPlane); } else if (cameraMode == PERSPECTIVE) { glFrustum(left, right, bottom, top, nearPlane, farPlane); } else { glOrtho(left, right, bottom, top, nearPlane, farPlane); } glMatrixMode(GL_MODELVIEW); SceneObject *sceneObject = GetOwner(); assert(sceneObject != NULL); // Cannot setup camera with it being owned by a scene object glm::mat4 cameraMatrix = sceneObject->GetTransform()->GetLocalTransformInverse(); glLoadMatrixf(glm::value_ptr(cameraMatrix)); if (renderToTexture) { // float modelView[16]; // float projection[16]; glm::mat4 pj; glm::mat4 mv; glGetFloatv(GL_MODELVIEW_MATRIX, glm::value_ptr(mv)); glGetFloatv(GL_PROJECTION_MATRIX, glm::value_ptr(pj)); // Moving from unit cube [-1,1] to [0,1] glm::mat4 mat = glm::mat4( 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f); shadowMatrix = mat * pj*mv; } glClear(clearMaskNative); }
void Light::SetupLight(int lightIndex){ glEnable(GL_LIGHT0+lightIndex); // Setup and enable light 0 glLightfv(GL_LIGHT0+lightIndex,GL_AMBIENT, glm::value_ptr(GetAmbient())); glLightfv(GL_LIGHT0+lightIndex,GL_DIFFUSE, glm::value_ptr(GetDiffuse())); glLightfv(GL_LIGHT0+lightIndex,GL_SPECULAR, glm::value_ptr(GetSpecular())); glLighti(GL_LIGHT0+lightIndex, GL_SPOT_CUTOFF, spotCutoff); glLightfv(GL_LIGHT0+lightIndex,GL_SPOT_DIRECTION, glm::value_ptr(spotDirection)); float w = 0; if (GetLightType()==PointLight){ w = 1; } else if (GetLightType()==DirectionalLight){ w = 0; } SceneObject *sceneObject = GetOwner(); assert(sceneObject != NULL); glm::vec4 lightPos(sceneObject->GetTransform()->GetPosition(), w); glLightfv(GL_LIGHT0+lightIndex,GL_POSITION, glm::value_ptr(lightPos)); }
SceneObject* parseNode(KFbxNode *node, int level = 0) { KString s = node->GetName(); KFbxNodeAttribute::EAttributeType attributeType; stringstream ss; for (int i=0;i<level;i++){ ss<<" "; } SceneObject* sceneObject = NULL; MeshComponent* ga = NULL; if (node->GetNodeAttribute() == NULL){ ss<<"No node attribute"<<endl; } else { attributeType = node->GetNodeAttribute()->GetAttributeType(); switch (attributeType) { case KFbxNodeAttribute::eMARKER: ss<<"eMarker"<<endl; break; case KFbxNodeAttribute::eSKELETON: ss<<"eSkeleton"<<endl; break; case KFbxNodeAttribute::eMESH: { KFbxMesh *fbxMesh = node->GetMesh(); KFbxVector4 *controlPoints = fbxMesh->GetControlPoints(); int polygonCount = fbxMesh->GetPolygonCount(); vector<glm::vec3> vertices; vector<glm::vec3> normals; vector<glm::vec2> texCords; vector<int> polycount; assert(fbxMesh->GetLayerCount(KFbxLayerElement::eNORMAL)==1); // assume only one normal layer KFbxLayer *normalLayer = fbxMesh->GetLayer(0, KFbxLayerElement::eNORMAL); KFbxLayerElementNormal *normalElement = normalLayer->GetNormals(); KFbxLayerElementArrayTemplate<KFbxVector4> *normalArray = &(normalElement->GetDirectArray()); int normalCount = normalArray->GetCount(); vector<int> indices; assert(fbxMesh->GetControlPointsCount() <= USHRT_MAX); for (int i=0;i<fbxMesh->GetControlPointsCount();i++){ glm::vec3 v = toVector(controlPoints[i]); vertices.push_back(v); v = toVector(normalArray->GetAt(i)); normals.push_back(v); } for (int i=0;i<polygonCount;i++){ int polygonSize = fbxMesh->GetPolygonSize(i); polycount.push_back(polygonSize); for (int j=0;j<polygonSize;j++){ if (j>2){ // if polygon size > 2 then add first and last index // this triangulates the mesh int first = fbxMesh->GetPolygonVertex(i,0); int last = fbxMesh->GetPolygonVertex(i,j-1); indices.push_back(first); indices.push_back(last); } int polygonIndex = fbxMesh->GetPolygonVertex(i,j); indices.push_back(polygonIndex); /*KFbxVector4 vectorSrc = controlPoints[polygonIndex]; Vector3 vectorDst = toVector(vectorSrc); vertices.push_back(vectorDst); texCords.push_back(Vector2(0,0)); KFbxVector4 normalSrc = normalArray->GetAt(polygonIndex); Vector3 normalDst = toVector(normalSrc); normals.push_back(normalDst);*/ } } Mesh mesh; ss<<"Creating mesh: vertices "<<vertices.size()<<" normals "<<normals.size()<<" indices "<<indices.size()<<endl; mesh.SetVertices(vertices); mesh.SetNormals(normals); mesh.SetIndices(indices); sceneObject = new SceneObject(); ga = new MeshComponent(); ga->SetMesh(&mesh); sceneObject->AddCompnent(ga); // Set translate fbxDouble3 v3 = node->LclTranslation.Get(); glm::vec3 translate = toVector(v3); sceneObject->GetTransform()->SetPosition(translate); // Set rotation v3 = node->LclRotation.Get(); glm::vec3 rotation = toVector(v3)*Mathf::DEGREE_TO_RADIAN; sceneObject->GetTransform()->SetRotation(rotation); // Set scale v3 = node->LclScaling.Get(); glm::vec3 scale = toVector(v3); sceneObject->GetTransform()->SetScale(scale); } break; case KFbxNodeAttribute::eCAMERA: ss<<"eCAMERA"<<endl; break; case KFbxNodeAttribute::eLIGHT: ss<<"eLIGHT"<<endl; break; case KFbxNodeAttribute::eBOUNDARY: ss<<"eBOUNDARY"<<endl; break; default: ss<<s<<endl; } } if (node->GetChildCount()>0){ for (int i=0;i<node->GetChildCount();i++){ SceneObject *res = parseNode(node->GetChild(i),level+1); if (res!=NULL){ if (sceneObject == NULL){ sceneObject = new SceneObject(); } sceneObject->AddChild(res); } } } DEBUG(ss.str()); return sceneObject; }